3

简单请求是满足以下条件的请求:

  • HTTP 方法匹配(区分大小写)以下之一:

    • 得到
    • 邮政
  • HTTP 标头匹配(不区分大小写):

    • 接受
    • 接受语言
    • 内容-语言
    • 最后事件 ID
    • Content-Type,但仅当值为以下之一时:
      • 应用程序/x-www-form-urlencoded
      • 多部分/表单数据
      • 文本/纯文本

但是看看这个没有引起预检请求的测试页面:

一般的 :

Remote Address:69.163.243.142:80
Request URL:http://aruner.net/resources/access-control-with-get/
Request Method:GET
Status Code:200 OK

请求标头

Accept:*/*
Accept-Encoding:gzip, deflate, sdch
Accept-Language:en-US,en;q=0.8,he;q=0.6
Cache-Control:no-cache
Connection:keep-alive
DNT:1
Host:aruner.net
Origin:http://arunranga.com
Pragma:no-cache
Referer:http://arunranga.com/examples/access-control/simpleXSInvocation.html
User-Agent:Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36

响应标头

Access-Control-Allow-Origin:http://arunranga.com
Connection:Keep-Alive
Content-Type:application/xml
Date:Sat, 26 Sep 2015 09:00:26 GMT
Keep-Alive:timeout=2, max=100
Server:Apache
Transfer-Encoding:chunked

学究气,看request部分,有很多标题不在前面的标准部分中:

  • Cache-Control 不在名单上
  • Connection 不在名单上
  • DNTis not不在列表中
  • User-Agent 不在名单上
  • Accept-Encoding 不在名单上

我知道那些更多的是“通用”标题。也一样accept-language

问题

我在这里想念什么?根据标准部分,具有这些标头的请求导致预检请求。

4

2 回答 2

2

查看您的代码:

    invocation.open('GET', url, true);
    invocation.onreadystatechange = handler;
    invocation.send(); 

您实际上并没有设置任何自定义标题。例如

    invocation.setRequestHeader("X-Requested-With", "XMLHttpRequest");

因此不会有预检。默认浏览器标题不计算在内。预检机制仅用于确保接收站点允许跨域传递任何自定义标头,例如我上面示例中的标头。

于 2015-09-26T10:25:53.847 回答
2

作为已接受答案的进一步说明:请参阅Fetch Standard的HTTP 标头层划分部分(这些天定义了 CORS 协议和 UA 要求)。

出于获取的目的,该平台有一个 API 层(HTML's img,CSS' background-image),早期获取层,服务工作者层,以及网络和缓存层。AcceptAccept-Language在早期获取层中设置(通常由用户代理)。由用户代理控制的大多数其他标头,例如Accept-EncodingHostReferer,都在网络和缓存层中设置。开发人员可以在 API 层或服务工作者层(通常通过Request对象)设置标头。

因此,基于此,我们基本上可以说:

  • 问题中的标头由 UA 控制,并设置在“网络和缓存层”中</li>
  • 所以,header不是开发者可以在“API层”设置的header</li>
  • 因此,当算法运行以确定是否需要预检请求时,标头尚未设置(相反,它们稍后由 UA 设置,之后已经完成)

然后,鉴于上述情况,尽管可以在请求中看到这些标头,但我们知道它们在确定是否需要预检方面没有任何作用。

换句话说,这些标头本质上与 CORS 无关。同样,唯一相关的标头开发人员在“API 层”或服务工作者层中手动设置的标头。

于 2015-09-27T09:54:09.550 回答