在XMLHttpRequest中设置Authorization标头会更改HTTP谓词

时间:2014-03-14 16:40:16

标签: javascript html firefox

今天我发现了XMLHttpRequest的奇怪行为。当我调用GET服务时,我发现如果我没有设置Authorization标头,那么来自firefox的请求是相同的。但是如果我添加“授权”标题,firefox首先发送带有“OPTIONS”的请求,然后发送“GET”请求。

我知道必须在服务器端处理动词“OPTIONS”,但我只是想知道为什么XMLHttpRequest的行为如此。虽然它是跨域请求,但为什么浏览器首先发送“OPTIONS”请求。为什么添加“授权”标题会改变行为。

这是我的Javascript代码和Fidler Inspector报告。

    var  xmlhttp = new XMLHttpRequest();
    var url = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
    xmlhttp.open('GET',url,true);
    xmlhttp.setRequestHeader("Authorization", "xxxxxxxxxxxxxxxxxxx");
    xmlhttp.send(null);
    xmlhttp.onreadystatechange = function() {
            alert("OnReadystatechange + " + xmlhttp.readyState + " " + xmlhttp.status);
           if (xmlhttp.readyState == 4) {
              if ( xmlhttp.status == 200) {

                   }
                   else {

                   }
             }
             else
                   alert("Error ->" + xmlhttp.responseText);
          }

带有授权标题的小提琴响应

enter image description here

enter image description here

但是当我不添加Authorization标头时,浏览器会直接发送GET请求而不发出OPTIONS请求。

enter image description here

1 个答案:

答案 0 :(得分:12)

HTTP OPTIONS请求用于"预检"实际发送之前的跨源GET请求。

  

与简单的请求不同," preflighted"首先要求   通过OPTIONS方法向该资源发送HTTP请求   其他域,以确定实际请求是否安全   发送。跨站请求是这样的预检,因为它们可能   对用户数据有影响。特别是,请求是   预防如果:

     
      
  • 它使用GET,HEAD或POST以外的方法。此外,如果使用POST来发送除了
    以外的内容类型的请求数据   application / x-www-form-urlencoded,multipart / form-data或
      text / plain,例如如果POST请求将XML有效负载发送到
      服务器使用application / xml或text / xml,然后请求为
      预检。
  •   
  • 设置任何不简单的标头。如果标头字段名称是接受的ASCII不区分大小写匹配,则标头称为简单标头,接受语言,或内容语言,或者内容类型与标题字段值媒体的ASCII不区分大小写匹配type(不包括参数)是 application / x-www-form-urlencoded multipart / form-data text / plain的ASCII不区分大小写的匹配项
  •   

因此,在您的情况下,设置Authorization标头会导致请求被预检,因此OPTIONS请求。

More info here

Spec on Cross-Origin Request with Preflight