【发布时间】:2016-12-09 02:29:01
【问题描述】:
从我读到的关于CORS 的内容,我知道它应该如下工作:
- 客户端的脚本尝试从具有不同来源的服务器获取资源。
- 浏览器拦截此请求并首先向同一 URL 发出 preflight OPTIONS 请求。
- 如果对这个预检请求的响应包含适当的标头(例如
Access-Control-Allow-Origin: *),浏览器就会知道它可以发送主请求并执行它。 - 响应返回到客户端脚本。
我已经为它设置了一个这样的测试:
- Go 中的服务器同时接受 - GET 和 OPTIONS 请求(使用 CURL 检查) - 并在响应中设置
Access-Control-*标头 -
简单的 HTML 页面(由另一个端口上的另一个服务器提供服务),其中包含以下脚本(
$代表 jQuery):$.ajax({ type: "GET", crossDomain: true, url: "http://local.site.com/endpoint, success: function (data) { alert(data); }, error: function (request, error) { alert(error); } });
但是,当我调用此方法时,我在 Chrome 49 和 Firefox 33 的“网络”选项卡中只看到一个 GET 而没有预检 OPTIONS 请求。
以下是我来自 Chrome 的 GET 请求的详细信息:
Accept:*/*
Accept-Encoding:gzip, deflate, sdch
Accept-Language:en-US,en;q=0.8,ru;q=0.6
Connection:keep-alive
Host:local.adform.com
Origin:http://localhost:7500
Referer:http://localhost:7500/test-page.html
User-Agent:Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.87 Safari/537.36
以及相应的回应:
Access-Control-Allow-Headers:Accept, Content-Type, Content-Length, Accept-Encoding, X-CSRF-Token, Authorization
Access-Control-Allow-Methods:POST, GET, OPTIONS, PUT, DELETE
Access-Control-Allow-Origin:*
Content-Length:2
Content-Type:text/plain; charset=utf-8
Date:Wed, 03 Aug 2016 10:53:19 GMT
对为什么我的浏览器不发送预检请求有任何想法吗?
【问题讨论】:
-
预检并不总是完成,不太可能(如果有的话?)使用 GET - 请参阅 documentation 了解何时需要预检
-
有关浏览器何时发出预检请求的更多信息,请参阅this。
-
@JaromandaX:谢谢你的评论。如果并不总是需要预检请求,那么克服“同源”政策的(常规)方法是什么?场景是:我们创建一个脚本,该脚本将被合并到第 3 方网站中,并将向我们发送 我们的 cookie?据我了解,没有预检请求浏览器不会将 cookie 发送到我们的服务器,对吧?
-
请参阅我链接的文档中的下一部分 - request with credentials
-
我建议您阅读整个页面 - 内容丰富
标签: javascript jquery cors