tomcat web服务器重启后,Chrome Cookie无效

时间:2017-02-09 14:01:59

标签: google-chrome tomcat cookies

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

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

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

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

我发现了一些关于Chrome / tomcat cookie问题的帖子以及设置的建议, context.xml中的sessionCookiePathUsesTrailingSlash = false 但这并没有解决问题。

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

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

  1. 通过https
  2. 连接到网站
  3. logout / login
  4. 通过http
  5. 连接到网站
  6. 无法再存储Tomcat JSESSIONID cookie(存储奇怪的用户/密码cookie)
  7. 此操作仅在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。 我试过了<secure>false</secure>,但仍然遇到了旧问题。 所以,它至少与这个设置有关。有人有什么想法吗?

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

4 个答案:

答案 0 :(得分:10)

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

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

这是Tomcat在从HTTPS

创建会话时发送的响应标头
 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管理

     

如果用户代理收到NAME为的Set-Cookie响应头      与预先存在的cookie相同,以及其域和路径      完全属性值(字符串)与预先存在的属性值匹配      cookie,新的cookie取代旧的。

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

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

默认情况下,从HTTPS请求时,使用Secure创建JSESSIONID cookie。我想这就是Chrome不允许覆盖cookie的原因。但是,如果您尝试在<secure>false</secure>中设置web.xml,则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时使服务器会话无效。

最后我打开了一个关于铬的错误:https://bugs.chromium.org/p/chromium/issues/detail?id=698839

<强>已更新 该问题最终标记为赢得修复,因为它是故意更改。见https://www.chromestatus.com/feature/4506322921848832

  

严格保密Cookie

     

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

答案 1 :(得分:1)

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

可能的解决方案可能是在sessionCookiePathUsesTrailingSlash=false中添加context.xml,看看情况如何。

有关here

的问题的一些信息

enter image description here

讨论here (same solution)

希望我没有混淆这些问题,这可以帮助你,如果我需要编辑/如果有效/如果我应该删除,请告诉我,谢谢!

答案 2 :(得分:0)

draft document弃用“安全”的修改版本。来自非安全来源的Cookie(由Google提交)。它规定了修改HTTP State Management Mechanism文档的建议。

文件摘要:

  

本文档通过删除非中止的能力来更新RFC6265   使用“安全”设置Cookie的安全来源标志,并覆盖
  饼干的安全&#39;标志设置。这种弃用改善了   HTTP和HTTPS起源之间的隔离,降低了风险   恶意干扰。

几天前,

Chrome already implemented this feature in v 52和同一功能也implemented in Mozilla

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

答案 3 :(得分:0)

我认为糟糕的方法是在sessionCookieName = "JSESSIONIDForHttp"

中设置context.xml

让浏览器的cookie知道:

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

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