jQuery降级至1.1.0后Ajax请求出现“Refused to set unsafe header”错误
解决jQuery 1.1.0 Ajax "Refused to set unsafe header 'Connection'" 错误
这个问题的核心原因是jQuery 1.1.0是一个极其老旧的版本(发布于2006年),它的Ajax实现会自动尝试设置浏览器现在禁止的"Connection"请求头,而现代浏览器出于安全规范(XMLHttpRequest Level 2)不允许脚本设置这类"不安全"的请求头。至于为什么只有加载Google Captcha和支付iframe后才触发错误,大概率是这些第三方组件修改了全局的XMLHttpRequest对象或者触发了浏览器更严格的安全检查,让原本可能被忽略的问题暴露了出来。
下面是具体的解决办法,按优先级排序:
1. 优先升级jQuery版本(最推荐)
jQuery 1.1.0存在大量已知的安全漏洞、兼容性问题,以及像这样的过时API用法。如果客户坚持要用旧版本,至少说服他们升级到jQuery 1.x分支的最新稳定版(比如1.12.4)——这个版本已经修复了自动设置不安全请求头的问题,同时能兼容绝大多数旧浏览器,也能避免后续更多的兼容性坑。
只需要替换页面中引入的jQuery文件即可,无需修改你的Ajax调用代码。
2. 若必须保留jQuery 1.1.0,修改源码移除不安全头设置
如果升级完全不可行,你需要手动修改jQuery 1.1.0的源码,删除它自动设置"Connection"头的逻辑:
- 下载jQuery 1.1.0的未压缩源码(不要用压缩版,无法修改)
- 在源码中搜索字符串
"Connection",会找到类似这样的代码行:xhr.setRequestHeader("Connection", "keep-alive"); - 注释掉或者删除这一行代码
- 重新压缩源码,替换页面中引入的jQuery文件
修改后,你的Ajax请求就不会再尝试设置这个被浏览器禁止的请求头了,你的示例代码不需要做任何改动:
var val = 'somename'; $.ajax({ type: "GET", url: "/Home/Index", data: { 'Name': val }, success: function (data) { // success logic } });
3. 隔离第三方组件的影响(备选方案)
如果上述两种方法都无法实施,可以尝试隔离Google Captcha和支付iframe的全局影响:
- 把这些第三方组件放在独立的沙箱iframe中,避免它们修改主页面的XMLHttpRequest对象
- 或者尝试在加载第三方组件之前完成所有Ajax请求,但这种方法局限性很大,只适合特定场景
内容的提问来源于stack exchange,提问作者XamDev
相关产品推荐
相关产品推荐

