16

我有一个使用 jQuery.ajax 向另一台主机执行请求的 Web 应用程序(现在实际上是相同的,因为我使用的是“localhost”的不同端口)。然后服务器返回一个cookie。

Chrome 的开发工具中显示的 HTTP 响应中的 cookie 值是

Set-Cookie: MyUserSession=JxQoyzYm1VfESmuh-v22wyiyLREyOkuQWauziTrimjKo=;expires=Sun, 10 Feb 2013 22:08:47 GMT;path=/api/rest/

所以未来有 4 小时的到期时间。

但是,cookie 不会随后续请求一起存储和发送(在 Chrome 和 Firefox 中测试)。我首先认为它必须是“2013 年 2 月 10 日”而不是“2013 年 2 月 10 日”,但这并没有什么不同。Chrome 还在响应的 cookie 选项卡上将“过期”显示为“无效日期”,但这也可能是开发工具错误

有任何想法吗?

4

3 回答 3

29

我想我找到了解决方案。由于在开发过程中,我的服务器位于“localhost:30002”,而我的 Web 应用位于“localhost:8003”,因此它们在 CORS 方面被视为不同的主机。因此,我对服务器的所有请求都包含在 CORS 安全规则中,尤其是Requests with credentials。“凭据”包括该链接上注明的 cookie,因此返回的 cookie 不被接受,因为我没有通过

xhrFields: {
  withCredentials: true
}

到 jQuery 的$.ajax功能。我还必须将该选项传递给后续的 CORS 请求才能发送 cookie。

Access-Control-Allow-Credentials: true在服务器端添加了标头,并将Access-Control-Allow-Origin标头从通配符更改为http://localhost:8003(端口号很重要!)。该解决方案现在对我有用,并且 cookie 被存储。

于 2013-02-10T20:12:06.590 回答
4

在与类似的场景(没有 CORS)苦苦挣扎了几个小时之后,我发现了另一个潜在的原因:一定要明确设置 cookie 的路径

我的前端应用程序正在调用HOST_URL/api/members/login,这正在返回正确的Set-Cookie标题,没有路径。

我可以Response Cookies在 Chrome DevTools 下看到 cookie,但随后的请求不包括它。去了chrome://settings/cookies,饼干在那里,但路径是/api/members

在服务器端设置 cookie 时指定根路径解决了该问题。

于 2015-09-21T10:10:46.680 回答
0

你从哪里得到日期?

如果您手动添加它,请尝试使其防故障

var exdays = 3; //3 days valid as an example
var exdate=new Date();
exdate.setDate(exdate.getDate() + exdays);
//Now set the cookie to said exdate
document.cookie = "MyUserSession =" + escape(JxQoyzYm1VfESmuh-v22wyiyLREyOkuQWauziTrimjKo=)+"; expires="+exdate.toUTCString());
于 2013-02-10T18:32:10.493 回答