【问题标题】:Cookie mysteriously deleted after browser restart浏览器重启后cookie被神秘删除
【发布时间】:2015-04-11 17:04:48
【问题描述】:

我正在尝试设置一个有效期为 2 年的 cookie。但是,当我重新启动浏览器时,cookie 似乎被删除了。

这种行为似乎是随机的,有时 cookie 在重新启动时会保留,但在下次重新启动时它又消失了。

我的页面返回的完整标题:

HTTP/1.1 200 OK
Content-Length: 16
x-response-time: 11ms
Set-Cookie: ___auth=853c780cf6cacb177fd641af543c2e23048730aab126c2ee2f93cf0b725f3f30ec425160ea225761bee9bd9c100a1b897031f9194a7564301a9849b6e932440bb299cadabe885ca108973000bf5c183e; 
Expires=Fri, 10 Feb 2017 10:30:53 GMT; Path=/

目前它正在http://localhost:8080 上运行,尚未在生产中进行测试。行为发生在 chrome 和 firefox 中。

有什么想法吗?

【问题讨论】:

  • 你的java 标签让我有点困惑。您是否在网页中运行 Java 小程序?使用 Java 服务器?
  • @AlexanderO'Mara 在服务器上运行 java 作为语言。
  • 您的响应标题是否真的像您的问题一样包含Expires= 之前的换行符?如果是这样,那么浏览器可能正在创建一个会话 cookie,它将在关闭时被删除。
  • 您是在使用 Cookie API 还是在创建这些字符串并使用 headers API 将它们添加到响应中? :)
  • @AlexanderO'Mara 不,在浏览器中所有内容都集中在一行中,我在这里将其分解为更具可读性。

标签: java google-chrome session cookies http-headers


【解决方案1】:

如您所见here,Expires 属性在 HTTP 1.1 中已弃用,取而代之的是 Max-Age。如果您为特定 cookie 设置了一些年龄,则可以在下面的 cookie 中将其视为Max-age

Set-Cookie: UserID=JohnDoe; Max-Age=3600; Version=1

但在您的回复中,没有设置 Max-age , 所以它被视为会话 cookie 并在浏览器退出时被清除:-)

Set-Cookie: ___auth=853c780cf6cacb177fd641af543c2e23048730aab126c2ee2f93cf0b725f3f30ec425160ea225761bee9bd9c100a1b897031f9194a7564301a9849b6e932440bb299cadabe885ca108973000bf5c183e; 

所以像下面这样使用 Cookie API 创建 cookie,然后像这样将它们添加到 Servlet 中的 HttpServletResponse 中

Cookie cookie = new Cookie ("_auth", authString);
cookie.setMaxTime( 63072000 ); // time in seconds

response.addCookie(cookie);

有了这个,它应该会持续 2 年 :-)

【讨论】:

  • 根据那个页面,似乎推荐expires 优于max-age? “如果您关心您的 cookie 对大部分网络用户 (65.66%) 是否正常运行,请不要按照规范 (max-age) 以“正确的方式”保存您的 cookie,而是按照有效的方式保存它们 (expires) 。”
  • 哈哈..我以为你会问那个:-) 那篇帖子已经有5年了,作者的意图是支持IE6、IE7、IE8和其他旧版本的FF和Chrome .但是当前的现代浏览器完全符合标准,因此您可以毫无问题地使用Max-Age。因此,使用我的回答中提到的Cookie API 添加Max-Age 属性,因为这是现代浏览器所考虑的,我相信这就是您目前的问题所在:) 您是否也需要支持那些旧浏览器?
  • 我不认为问题出在 max-age 上,但是将其设置为 max-age 会导致 chrome 显示所有其他 cookie,并且我看到我的框架在每个结束时都重置了 cookie请求,但没有发送正确的过期/最大年龄。我跟踪并修复了这个错误,现在一切正常。您的评论帮助我找到了这一点,因此我将接受 + 奖励。
  • 这很有趣:我的框架在请求开始时读取所有 cookie,然后在最后添加它们。但是,在 chrome 中,我看到使用请求标头,只发送 cookie 名称和值,但不发送 expires / max-age。因此,我的框架将其解释为“默认到期时间,即在会话结束时”,并且当它添加回 cookie 时,它​​会使用默认到期时间添加它。任何想法为什么 chrome 不将过期时间与 cookie 一起发送回来?
  • 我认为 Expires / Max-Age 信息只是告诉浏览器应该保留该 Cookie 的时间。它不会在后续请求中发送到服务器,只是将 Cookie 名称和值添加到请求标头中
猜你喜欢
  • 2011-09-20
  • 2023-03-17
  • 2018-02-25
  • 1970-01-01
  • 2014-06-15
  • 2018-10-25
  • 2015-06-13
  • 2010-11-19
  • 2011-02-18
相关资源
最近更新 更多