带有域字段的 CORS cookie 仅在使用 jQuery AJAX 的 Firefox 中设置

Posted

技术标签:

【中文标题】带有域字段的 CORS cookie 仅在使用 jQuery AJAX 的 Firefox 中设置【英文标题】:CORS cookie with domain field is setting only in Firefox using jQuery AJAX 【发布时间】:2012-12-06 21:28:59 【问题描述】:

当使用跨站点请求添加domain 归档时,我无法设置 cookie。我试图通过 jquery ajax 调用请求来实现这一点。

是否有可能让它在除火狐之外的其他浏览器中运行?

一些请求标头:

Accept:application/json, text/javascript, */*; q=0.01
Content-Length:55
Content-Type:application/x-www-form-urlencoded; charset=UTF-8
Host:localhost:53862
Origin:http://localhost:54265
Referer:http://localhost:54265/

响应标头:

Access-Control-Allow-Credentials:true
Access-Control-Allow-Headers:x-requested-with, origin, content-type, accept, Proxy-Connection
Access-Control-Allow-Methods:GET,POST,PUT,OPTIONS, DELETE
Access-Control-Allow-Origin:http://localhost:54265
Set-Cookie:Auth=l_hash=123456&user=xyzl&remember_me=false; expires=Fri, 18 Jan 2013 13:42:10 GMT; domain=localhost; path=/

代码:

$.ajax(
    type: "PUT",
    url: apiHost + "api/account/login/",
    data: $("#loginBarForm").serialize(),
    dataType: "json",
    contentType: "application/x-www-form-urlencoded; charset=UTF-8",
    crossDomain: true,

    xhrFields: 
        withCredentials: true
    ,
);

Firefox 一切正常。 Chrome 没有设置 cookie。仅当域字段被删除时,所有浏览器都可以正常工作。我可以看到在下一个请求中(设置 cookie 之后)该 cookie 出现在标题中。响应设置 cookie 后的 firefox 请求示例(当响应具有域字段时):

Cookie: Auth=l_hash=123456&user=xyz&remember_me=false

【问题讨论】:

您确定localhostSet-Cookie 标头的有效域吗?根据RFC,它必须包含至少一个“嵌入”点。 FireFox 可能会以一种限制较少的方式实现这一点。请尝试使用您的 IP 地址。 @Stan 非常感谢,请将其发布为答案。 【参考方案1】:

我认为问题可能出在localhost,它不是Set-Cookie 标头的有效域。根据RFC,它必须包含至少一个“嵌入”点。 FireFox 可能会以较少限制的方式实现这一点。请改用您的 IP 地址。

【讨论】:

简单地将localhost 替换为127.0.0.1 对我有用。谢谢!【参考方案2】:

我遇到了同样的问题,结果是浏览器设置阻止了第三方 cookie(Chrome > 设置 > 高级设置 > 隐私 > 内容设置 > 阻止第三方 cookie 和站点数据)。允许 cookie 解决了问题!

【讨论】:

是的,经过数小时的挫折,这解决了我的问题!只有在我的情况下,我让 Firefox 阻止了第三方 cookie,而 Chrome 允许它们。

以上是关于带有域字段的 CORS cookie 仅在使用 jQuery AJAX 的 Firefox 中设置的主要内容,如果未能解决你的问题,请参考以下文章

将 cookie 域设置为 IP 地址(使用 CORS)

koa开启cors允许跨域,携带cookies

http头部字段access

即使所有 CORS 允许,Firefox 也不会保留跨域发送的 cookie

CORS跨域操作cookie

为啥在 CORS/跨域场景下基于 token 的认证优于基于 cookie 的认证?