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

Gul*_*han 10 html javascript firefox

今天我发现了XMLHttpRequest的奇怪行为.当我调用GET服务时,我发现如果我没有设置Authorization标头,则来自firefox的请求是相同的.但是如果我添加"Authorization"标题,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);
          }
Run Code Online (Sandbox Code Playgroud)

和授权标题的提琴响应

在此输入图像描述

在此输入图像描述

但是当我没有添加Authorization标头时,浏览器直接发送GET请求而没有OPTIONS请求.

在此输入图像描述

lev*_*evi 12

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

与简单请求不同,"预检"请求首先通过OPTIONS方法向另一个域上的资源发送HTTP请求,以确定实际请求是否可安全发送.跨站点请求是这样预检的,因为它们可能对用户数据有影响.特别是,如果出现以下情况,请求会被预检:

  • 它使用GET,HEAD或POST以外的方法.此外,如果POST用于发送具有除
    application/x-www-form-urlencoded,multipart/form-data或
    text/plain 之外的Content-Type的请求数据,例如,如果POST请求将XML有效负载发送到
    服务器使用application/xml或text/xml,请求
    预检.
  • 它设置任何不简单的标头.如果头字段名称是Accept,Accept-LanguageContent-Language的ASCII不区分大小写的匹配,或者如果它是Content-Type和头字段的ASCII不区分大小写的匹配,则称头是简单头值媒体类型(不包括参数)是对application/x-www-form-urlencoded,multipart/form-datatext/plain的ASCII不区分大小写的匹配.

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

更多信息在这里

具有预检的交叉原始请求规范