WebKit“拒绝设置不安全的标题”内容长度“”

我试图实现简单的xhr抽象,并试图为POST设置标题时得到此警告。 我认为这可能与在一个单独的js文件中设置标题有关,因为当我将它们放在.html文件的<script>标记中时,它工作正常。 POST请求工作正常,但我得到这个警告,并且很好奇为什么。 我得到这个content-lengthconnection头的警告,但只有在WebKit浏览器(Chrome 5testing版和Safari 4)。 在Firefox中,我没有得到任何警告,Content-Length头被设置为正确的值,但连接被设置为保持活动,而不是closures,这让我觉得它也忽略了我的setRequestHeader调用和生成它自己的。 我没有在IE中试过这个代码。 这是标记和代码:

test.html

 <!DOCTYPE html> <html> <head> <script src="jsfile.js"></script> <script> var request = new Xhr('POST', 'script.php', true, 'data=somedata', function(data) { console.log(data.text); }); </script> </head> <body> </body> </html> 

jsfile.js

 function Xhr(method, url, async, data, callback) { var x; if(window.XMLHttpRequest) { x = new XMLHttpRequest(); x.open(method, url, async); x.onreadystatechange = function() { if(x.readyState === 4) { if(x.status === 200) { var data = { text: x.responseText, xml: x.responseXML }; callback.call(this, data); } } } if(method.toLowerCase() === "post") { x.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); x.setRequestHeader("Content-Length", data.length); x.setRequestHeader("Connection", "close"); } x.send(data); } else { // ... implement IE code here ... } return x; } 

它也忽略了我的setRequestHeader调用并生成它自己的

是的, 标准说它必须:

出于安全原因,如果标题为[…]

  • 连接
  • 内容长度

乱搞这些可能会暴露各种请求走私攻击,所以浏览器总是使用自己的价值观。 没有必要或者没有理由设置请求长度,因为浏览器可以根据您传递的数据长度send()准确地完成请求。