今天我发现了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);
}
带有授权标题的小提琴响应
但是当我不添加Authorization标头时,浏览器会直接发送GET请求而不发出OPTIONS请求。
答案 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
请求。