是什么原因导致无法在客户端上设置cookie



我有一个web应用程序,它使用jQuery.ajax来执行对另一台主机的请求(现在实际上是一样的,因为我使用的是"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年二月10日"。但这并没有什么区别。Chrome还在响应的cookie选项卡上显示"过期"为"无效日期",但这也可能是开发工具的错误。

有什么想法吗?

我想我找到了解决方案。由于在开发过程中,我的服务器位于"localhost:30002",我的web应用程序位于"localhost:8003",因此它们被认为是关于CORS的不同主机。因此,我对服务器的所有请求都受CORS安全规则的保护,尤其是带有凭据的请求。"凭据"包括该链接上注明的cookie,因此返回的cookie不被接受,因为我没有通过

xhrFields: {
  withCredentials: true
}

到jQuery的CCD_ 1函数。为了发送cookie,我还必须将该选项传递给后续的CORS请求。

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

在与类似的场景(没有CORS)斗争了几个小时后,我发现了另一个潜在的原因:请确保明确设置cookie的路径

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

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

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

您从哪里获得日期?

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

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());

相关内容

  • 没有找到相关文章

最新更新