CORS:为什么我的浏览器不;t发送OPTIONS飞行前请求
CORS: Why my browser doesn't send OPTIONS preflight request?
从我读到的关于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请求,而没有preflight OPTIONS请求。
以下是我从Chrome获取请求的详细信息:
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浏览器并不总是发送飞行前选项请求。如果确实需要飞行前,让浏览器发送它的一种方法是设置自定义标题(例如"X-PINGOVER:pingpong"或其他什么)。请注意,该服务器还应允许此请求标头,方法是将其添加到"Access Control allow Headers"响应标头。
我的基本目标是将域为a.com
的cookie传递到a.com
的服务器,但从另一个站点的页面传递到b.com
(这方面的常见用例是在第三方网站上跟踪您的用户)。事实证明,在请求的同时发送cookie需要做更多的工作。
在上,客户端(即在JavaScript中)需要启用跨域请求并允许传递凭据。例如,jQuery的以下请求对我有效:
$.ajax({
type: "GET",
url: "http://example.com",
xhrFields: {
withCredentials: true // allow passing cookies
},
crossDomain: true, // force corss-domain request
success: function (data) { ... },
error: function (request, error) { ... }
});
在上,服务器端需要设置2个响应标头:
Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: <requester origin>
其中CCD_ 9是执行呼叫的网站的协议+主机+端口。请注意,通用的*
可能在许多浏览器中不起作用,因此服务器解析请求的Referer
标头并使用特定的允许来源进行响应是有意义的。
相关文章:
- 如何为json对象中的段发送array[]
- 我想使用模态通过php文件发送邮件,并且我希望在提交关闭后关闭pop
- 在验证和发送邮件后更改联系人表单的 html
- 将Javascript数组发送到控制器ASP.NET MVC
- 如何将字符串值从php页面发送到java脚本页面
- 使用angularjs向浏览器发送servlet响应(下载功能)
- 如何使用Socket.io将命令从客户端发送到服务器
- MockJax没有在JavaScript应用程序中发送对我AJAX请求的响应
- 如何在react js中将值从一个组件发送到另一个组件
- 如何阻止Backbone.js发送OPTIONS请求
- jQuery.ajax't发送带有OPTIONS请求的Authorization标头
- Ext.Ajax.request 发送 OPTIONS 请求跨域,当 jQuery.ajax 发送 GET 时
- 长时间轮询可避免发送OPTIONS和GET组合[跨域]
- 在GET之前重新调整发送OPTIONS方法的角度
- 发送飞行前(OPTIONS)AJAX请求和crendentials
- 为什么发送多个OPTIONS请求,即使Access-Control-Allow-Origin设置为*
- 如何发送保存多个ng-options json数据
- Angular ng-options发送数组值
- 使用$发送查询字符串.ajax类型OPTIONS
- CORS:为什么我的浏览器不;t发送OPTIONS飞行前请求