在JavaScript中设置请求标头

use*_*196 61 javascript ajax

在使用XMLHttpRequest进行AJAX调用时,似乎无法从JavaScript更改大多数请求标头.请注意,request.setRequestHeader必须request.open()在Gecko浏览器中调用后(请参阅http://ajaxpatterns.org/Talk:XMLHttpRequest_Call).当我设置Referer时,它没有设置(我查看了使用Firebug和Tamper Data发送的请求标头).当我设置User-Agent时,它完全搞砸了AJAX调用.但是,设置AcceptContent-Type确实有效.我们是否阻止在Firefox 3中设置RefererUser-Agent

var request = new XMLHttpRequest();
var path="http://www.yahoo.com";
request.onreadystatechange=state_change;

request.open("GET", path, true);
request.setRequestHeader("Referer", "http://www.google.com");
//request.setRequestHeader("User-Agent", "Mozilla/5.0");
request.setRequestHeader("Accept","text/plain");
request.setRequestHeader("Content-Type","text/plain");

request.send(null);
    function state_change()
{
if (request.readyState==4)
  {// 4 = "loaded"
  if (request.status==200)
    {// 200 = OK
    // ...our code here...
    alert('ok');
    }
  else
    {
    alert("Problem retrieving XML data");
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

gna*_*arf 71

关于setrequestheader的W3C规范.

简要点:

如果已经设置了请求头,则必须使用U + 002C COMMA后跟U + 0020 SPACE将新值连接到现有值以进行分离.

UAs可以为User-Agent标头提供初始值,但必须允许作者向其附加值.

但是 - 在jQuery中搜索框架XHR之后,它们不允许您更改User-Agent或Referer标头.最接近的事情:

// Set header so the called script knows that it's an XMLHttpRequest
xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");
Run Code Online (Sandbox Code Playgroud)

我倾向于认为你想要做的是被FF中的安全策略拒绝 - 如果你想传递一些自定义Referer类型的标题,你可以随时做:

xhr.setRequestHeader('X-Alt-Referer', 'http://www.google.com');
Run Code Online (Sandbox Code Playgroud)