简单请求是符合以下条件的请求:
HTTP方法匹配(区分大小写)以下之一:
HTTP标头匹配(不区分大小写):
但是看看这个test page不会导致预检请求:
一般:
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
不在列表中 DNT
不在列表中 User-Agent
不在列表中 Accept-Encoding
不在列表中 我知道那些更多的是"一般"头。 但 accept-language
问题
我在这里缺少什么?根据条件部分,带有标题的请求会导致预检请求。
答案 0 :(得分:2)
查看您的代码:
invocation.open('GET', url, true);
invocation.onreadystatechange = handler;
invocation.send();
您实际上并未设置任何自定义标头。 e.g。
invocation.setRequestHeader("X-Requested-With", "XMLHttpRequest");
因此不会有预检。默认浏览器标头不计算。预检机制仅用于确保接收站点允许任何自定义标头(例如上面示例中的标头)通过跨域传递。
答案 1 :(得分:2)
在接受的答案之上进一步说明:请参阅HTTP header layer division的Fetch Standard部分(这些天定义了CORS协议和UA要求)。
为了获取,平台有一个API层(HTML' s
img
,CSS'background-image
),早期获取层,服务工作者层, 和网络&缓存层。设置了Accept
和Accept-Language
早期获取层(通常由用户代理)。大多数其他 由用户代理控制的标头,例如Accept-Encoding
,Host
和Referer
已设置在网络&缓存层。 开发人员可以在API层或服务中设置标头 工作层(通常通过Request
对象)。
因此,基于此,我们基本上可以说:
然后,鉴于上述情况,尽管在请求中可以看到这些标题,但我们知道他们没有参与确定是否需要预检。
换句话说,这些标题基本上与CORS无关。同样, 相关的唯一标题是开发人员在“API层”或服务工作者层中手动设置的标题。