【问题标题】:What can cause a cookie not to be set on the client?什么会导致没有在客户端上设置 cookie?
【发布时间】: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 路径限制 - 仍然没有被存储!

标签: ajax http cookies cross-domain same-origin-policy


【解决方案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 才能匹配您想要的课程到期时间
    猜你喜欢
    • 2016-06-13
    • 2017-05-31
    • 2020-10-21
    • 2017-01-01
    • 2014-03-31
    • 2017-10-11
    • 2020-01-19
    • 2012-02-21
    • 2013-12-02
    相关资源
    最近更新 更多