什么会导致没有在客户端上设置 cookie?
Posted
技术标签:
【中文标题】什么会导致没有在客户端上设置 cookie?【英文标题】:What can cause a cookie not to be set on the client? 【发布时间】:2013-01-25 21:33:35 【问题描述】:我有一个 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 年 2 月 10 日”,但这并没有什么不同。 Chrome 还会在响应的 cookie 选项卡上将“过期”显示为“无效日期”,但这也可能是 Dev Tools bug。
有什么想法吗?
【问题讨论】:
您是否尝试在网络服务器中运行您的代码,例如不在本地主机上? 你用什么语言写这个? 另外,假设您不在格林威治标准时间,您在哪个时区? 我使用ServiceStack 来提供网络服务。我的时区是柏林(目前是 GMT+1),所以这不是 IMO 的问题。 我现在也尝试在外部主机上使用服务器,同样的问题。甚至将 cookie 更改为简单的“MyUserSession=TESTTEST”,即会话到期且没有 URL 路径限制 - 仍然没有被存储! 【参考方案1】:我想我找到了解决方案。由于在开发过程中,我的服务器位于“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 被存储。
【讨论】:
你救了我们,我的英雄! 这并不能回答问题或只是其中的一部分。 您能否就您希望以更好的方式回答的缺少哪部分提出建设性意见?【参考方案2】:在与类似情况(无 CORS)苦苦挣扎了几个小时后,我发现了另一个潜在原因:一定要明确设置 cookie 的路径。
我的前端应用程序正在调用HOST_URL/api/members/login
,这将返回正确的Set-Cookie
标头,没有路径。
我可以在 Chrome DevTools 中看到 Response Cookies
下的 cookie,但随后的请求不包括它。去了chrome://settings/cookies
,cookie在那里,但是路径是/api/members
。
在服务器端设置 cookie 时指定根路径修复了该问题。
【讨论】:
【参考方案3】:你从哪里得到日期?
如果您手动添加它,请尝试使其防故障
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());
【讨论】:
好主意。我在 JS 控制台中输入了document.cookie = "MyUserSession=JxQoyzYm1VfESmuh-v22wyiyLREyOkuQWauziTrimjKo=;expires=Sun, 10 Feb 2013 22:08:47 GMT;path=/api/rest/"
,cookie 实际上出现在我的 cookie 调试扩展中。很奇怪。
您是否可能只是忘记在之前的代码中将 cookie 附加到文档中? IIRC 例如,它不能附加到 window.cookie
顺便说一句,它必须是 exdate.setDate(exdate.getTime() + (exhours *3600) ); //where exhours is 4 in your case
才能匹配您想要的课程到期时间以上是关于什么会导致没有在客户端上设置 cookie?的主要内容,如果未能解决你的问题,请参考以下文章