请教关于 CORS 中 Access-Control-Allow-Credentials 的问题

2017-02-15 15:11:29 +08:00
 ppy

我在后端代码在响应头中设置了

Access-Control-Allow-Credentials : true
Access-Control-Allow-Origin:*

按照 CORS 的规则: https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Access_control_CORS#附带凭证信息的请求 ,这个响应应该会失败。

但实际上结果是这样的

Access-Control-Allow-Credentials:true
Access-Control-Allow-Origin:*
Connection:keep-alive
Content-Length:2514
Content-Type:application/json

响应也成功了。

请大佬指教- -

15640 次点击
所在节点    程序员
9 条回复
ferrum
2017-02-15 15:15:43 +08:00
不太懂在问什么,但后端设置了这样的 header ,跨域请求时, withCredentials 为 true 的请求应该会带上 cookies 的。
Arrowing
2017-02-15 15:16:25 +08:00
如果是需要带 cookie 等验证信息的请求,请加上
xhrFields: {
withCredentials: true
}
参数,参照 jQuery1.5.1+的文档

http://www.css88.com/jqapi-1.9/jQuery.ajax/
ppy
2017-02-15 15:22:55 +08:00
@ferrum 目的是想通过 CORS 的规则,让前端请求接口的时候带上 cookies ,所以设置了 Access-Control-Allow-Credentials : true 这样的响应头,同时之前设置的 Access-Control-Allow-Origin:*。这里按照文档应该会导致前端的这次请求失败,但结果是没有。

withCredentials:true 是 jq 里面请求带上验证信息,这我知道。
ppy
2017-02-15 15:25:23 +08:00
@Arrowing 嗯 withCredentials: true 前端这样设置了,的确将 cookies 信息传递上来了,但我困惑的是 CORS 规则里面说到:给一个带有 withCredentials 的请求发送响应的时候, 服务器端必须指定允许请求的域名,不能使用'*'.如果响应头是这样的:Access-Control-Allow-Origin: * ,则响应会失败.
ferrum
2017-02-15 15:37:56 +08:00
噢,这个问题我以前也遇到过,正常情况下,浏览器会把响应拦截了,你是通过浏览器访问的吗,还是浏览器做了如 Chrome 的 disable-web-security 的设置?
ppy
2017-02-15 15:56:25 +08:00
@ferrum Chrome 的 disable-web-security 的设置。
哦你这么一说这个设置我知道为什么我会困惑了,其实没有发生跨域的问题。

服务端这么设置了,前端开发的时候使用了 Chrome 的 disable-web-security 的设置,所以浏览器没有拦截响应。

而我访问已经上线的前端页面时,因为前后端都是部署在同一个 host 上的所以不存在跨域的问题。

那我还想在问一个问题,前端在本地开发的时候,会跨域,服务端的 Access-Control-Allow-Origin 应该如何设置呢,
前端的文件在浏览器都是电脑内文件的地址。
cfy
2017-02-15 16:32:38 +08:00
我最近也遇到 CORS 的问题,

如果服务端是 Nginx 的话,可以参考 https://gist.github.com/pauloricardomg/7084524

if ($http_origin ~* ( https?://.*\.example\.com(:[0-9]+)?$)) {
add_header Access-Control-Allow-Origin: $http_origin;
}
ppy
2017-02-16 09:20:59 +08:00
@cfy 嗯 还可以这样在 nginx 中设置 这样可以把跨域的设置从代码中解耦出来 涨姿势了。
734695609
2018-12-12 01:30:50 +08:00
@cfy 同一 IP 的不同端口也是跨域的。
针对你的这句话:而我访问已经上线的前端页面时,因为前后端都是部署在同一个 host 上的所以不存在跨域的问题。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/340648

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX