【问题标题】:Chrome cookies not working after tomcat web server rebootTomcat Web 服务器重启后 Chrome cookie 不起作用
【发布时间】:2017-06-27 13:57:34
【问题描述】:

我最近注意到,当我重新启动 Tomcat 网络服务器时,Chrome 浏览器无法再存储 cookie。即tomcat使用cookie进行http会话,浏览器无法再获取它的http会话,我们用来存储登录用户的cookie失败,用户不会保持登录状态。

这似乎是 Chrome 的一个新问题,可能来自最近的更新,我不记得以前见过它。如果我关闭 Chrome 浏览器,然后重新打开它,就可以了(直到服务器再次重新启动)。

这个问题在 Firefox 上没有发生,似乎是 Chrome 中的一个错误。

有其他人注意到这个问题,或者知道解决方案吗?

我发现了一些关于 Chrome/tomcat cookie 问题和设置建议的帖子, sessionCookiePathUsesTrailingSlash=false 在 context.xml 但这并不能解决问题。

这似乎与同时支持https和http的网站有关,并在两者之间切换(虽然它确实发生在不支持https的网站上......)

好的,我现在可以重新创建问题,步骤是。

  1. 通过 https 连接到网站
  2. 注销/登录
  3. 通过 http 连接到网站
  4. 无法再存储 Tomcat JSESSIONID cookie(奇怪的是存储了用户/密码 cookie)

这仅发生在 Chrome 上,并且仅在 Chrome 更新后在使用 http 的登录页面上添加了“不安全”标志

好的,我将它添加到我的 web.xml 中

<session-config>
    <cookie-config>
        <http-only>true</http-only>
        <secure>true</secure>
    </cookie-config>
</session-config>

这并没有解决问题,而是使问题总是通过 http 发生,即使 http 不再能够存储 JSESSIONID cookie。 我试过&lt;secure&gt;false&lt;/secure&gt;,但还是遇到了老问题。 因此,它至少与此设置有关。有人有什么想法吗?

在 Chrome 上记录错误, https://bugs.chromium.org/p/chromium/issues/detail?id=698741

【问题讨论】:

  • 所以好像是新版Chrome的Chrome浏览器打开时间过长,突然无法保存网站的cookies,JSESSIONID突然没有设置。当 www 版本开始失败时,不使用“www”的同一网站可以正常工作,https 似乎也可以正常工作,很奇怪。
  • 我猜这是最近 chrome 更新中的一个错误,似乎已经修复了。但是如果有人没有重新启动chrome,他们仍然存在在某些状态下无法正确存储cookie的bug版本。
  • Chrome 还是会出现这个问题,不知何故,如果你让它运行时间过长,它就会开始不为某些网站保留 cookie
  • 这不能回答您的问题,因此它只是一个评论:尝试编写一个 Selenium 集成测试来重现该问题。一旦它被自动化,您就可以尝试变体,也许可以找到解决方法,报告错误等。可重现的错误通常会更快地修复。
  • 我无法始终如一地重现它。一旦浏览器停止保存cookies,它就无法正常工作,但是一旦我重新启动chrome,它就又好了。这个问题出现在我们的几个 Tomcat 网站上,并且来自几台不同的机器,始终仅来自 Chrome,并且在重新启动后始终正常。仅在最后一次 Chrome 更新后的最后一个月左右,在不使用 https 的任何登录页面上添加了“不安全”标志

标签: google-chrome tomcat cookies


【解决方案1】:

我能够用 Chrome 重现您的问题:只需从 HTTPS 区域创建 HttpSession。任何后续的 HTTP 请求都不会发送会话 cookie,并且任何通过 HTTP 对Set-Cookie:JSESSIONID= 的尝试都会被 chrome 忽略。

当用户从 HTTPS 切换到 HTTP 时,问题已局部化。即使服务器重新启动并正常工作,HTTPS 会话 cookie 也会保留。 (我使用 Tomcat6、Tomcat 9 进行了测试,并使用 apache 代理进行 SSL)

这是从 HTTPS 创建会话时 Tomcat 发送的响应标头

 Set-Cookie: JSESSIONID=CD93A1038E89DFD39F420CE0DD460C72;path=/cookietest;Secure;HttpOnly

这个用于 HTTP(注意 Secure 缺失)

 Set-Cookie:SESSIONID=F909DBEEA37960ECDEA9829D336FD239;path=/cookietest;HttpOnly

Chrome 会忽略第二个 set-Cookie。另一方面,Firefox 和 Edge 将 Secure cookie 替换为 not-secured。为了确定正确的行为应该是什么,我查看了RFC2109

4.3.3 Cookie 管理

如果用户代理收到一个名称为 与预先存在的 cookie 相同,并且其域和路径 属性值完全(字符串)匹配那些预先存在的 cookie,新 cookie 取代旧 cookie。

所以,很明显这是一个 chrome 错误,正如您在问题中所假设的那样:HTTP cookie 应该替换由 HTTPS 设置的那个

从 Chrome 中手动删除 cookie 或在服务器端使会话无效使其再次工作(如果在这些操作之后使用 HTTP 创建会话)

默认情况下,当从 HTTPS 请求时,JSESSIONID cookie 是使用 Secure 创建的。我想这就是 Chrome 不允许覆盖 cookie 的原因。但是,如果您尝试在web.xml 中设置&lt;secure&gt;false&lt;/secure&gt;,Tomcat 会忽略它,并且Set-Cookie 标头与Secure 一起发送

<session-config>
    <cookie-config>
        <http-only>true</http-only>
        <secure>true</secure>
    </cookie-config>
</session-config>

更改 cookie 名称、设置 sessionCookiePathUsesTrailingSlash 或删除 HttpOnly 均无效

除了在登录用户从 HTTPS 切换到 HTTP 时使服务器会话无效之外,我找不到解决此问题的方法。

最后我在 chromium 中打开了一个 bug:https://bugs.chromium.org/p/chromium/issues/detail?id=698839


更新 该问题最终被标记为 Won't Fix,因为这是一个有意的更改。见https://www.chromestatus.com/feature/4506322921848832

严格的安全 Cookies

这增加了对标有“安全”属性的 cookie 的限制。目前,不安全(例如 HTTP)的来源无法访问安全 cookie。但是,不安全的来源仍然可以添加安全 cookie、删除它们或间接驱逐它们。此功能会修改 cookie jar,以便不安全的来源无法以任何方式接触安全 cookie。这确实为 cookie 驱逐留出了余地,这仍然可能导致安全 cookie 被删除,但只有在所有非安全 cookie 都被驱逐之后。

【讨论】:

  • 当我阅读这个优秀的评论时,我还认为这应该被报告为 Chromium 中的一个错误。对于问题 OP,这里是问题跟踪器 URL:chromiumbugs.appspot.com
  • @i336_ 我查看了 RFC,我认为这绝对是一个错误。在更新的答案中是链接。可能是一些明星可以帮助...
  • 我刚打开那个问题 (698839) 发现它已经被 WontFix'ed 了。 :( 仅供参考,已关闭的票证不会生成更新;如果您对关闭票证的原因有任何争论或想要修改它,请不要费心更新该票证。只需创建一个新票证并在此处使用新问题 URL 编辑问题.(从经验上讲)
  • 另外,如果您有多余的资源,您可以使用混淆链接(三倍 base64 或 Python oneliner 等)将问题编辑为演示此问题的隔离最小实时测试用例(没有编辑代码的能力 - 只需测试登录/注销)。然后人们可以自己戳那个活实例。只是一个想法,没有必要;如果您想要超级快速的答案(考虑到赏金),这可能是一个想法。
【解决方案2】:

我记得看过几次,据我所知,这是关于此事的唯一建议,正如你提到的:

一个可能的解决方案可能是在context.xml 中添加sessionCookiePathUsesTrailingSlash=false,看看效果如何。

来自here的一些信息

讨论here (same solution)

希望我没有混淆这些问题,这对你有帮助,如果我需要编辑/如果工作/如果我应该删除,请在评论中告诉我,谢谢!

【讨论】:

    【解决方案3】:

    有一个draft document 反对修改来自非安全来源的“安全”cookie(由 Google 提交)。它指定了修改HTTP State Management Mechanism 文档的建议。

    文件摘要:

    本文档更新了 RFC6265,删除了非
    使用“安全”标志设置 cookie 并覆盖
    设置了“安全”标志的 cookie。此弃用改进了
    HTTP 和 HTTPS 源之间的隔离,并降低风险
    恶意干扰。

    Chrome already implemented this feature in v 52 和几天前的 implemented in Mozilla 也是相同的功能。

    要解决这个问题,我认为你应该只通过 https 连接到网站。

    【讨论】:

      【解决方案4】:

      我认为不好的方法是在context.xml中设置sessionCookieName = "JSESSIONIDForHttp"

      让浏览器的cookie知道:

      1. 如果安全https 条件使用默认"JSESSIONID"

      2. 如果不安全 http 条件使用 "JSESSIONIDForHttp"

      【讨论】:

        猜你喜欢
        • 2013-11-20
        • 2021-06-18
        • 1970-01-01
        • 1970-01-01
        • 2018-07-26
        • 2021-07-31
        • 1970-01-01
        • 1970-01-01
        • 2012-01-25
        相关资源
        最近更新 更多