我有一个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());