tomcat web服务器重启后,Chrome cookie无法正常工作

Jam*_*mes 18 cookies tomcat google-chrome

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

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

问题不会发生在Firefox上,似乎是Chrome中的一个错误.

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

我在context.xml中找到了一些关于Chrome/tomcat cookie问题的帖子以及设置的建议,sessionCookiePathUsesTrailingSlash = false但这不能解决问题.

它似乎可能与支持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>
Run Code Online (Sandbox Code Playgroud)

这并没有解决问题,但是问题总是通过http发生,即使http不再能够存储JSESSIONID cookie.我试过<secure>false</secure>但仍然遇到了旧问题.所以,它至少与这个设置有关.有人有主意吗?

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

ped*_*ofb 11

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

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

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

 Set-Cookie: JSESSIONID=CD93A1038E89DFD39F420CE0DD460C72;path=/cookietest;Secure;HttpOnly
Run Code Online (Sandbox Code Playgroud)

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

 Set-Cookie:SESSIONID=F909DBEEA37960ECDEA9829D336FD239;path=/cookietest;HttpOnly
Run Code Online (Sandbox Code Playgroud)

Chrome忽略了第二个set-Cookie.另一方面,Firefox和Edge用Securenot 替换cookie secured.为了确定应该采取的正确行为,我已经审查了RFC2109

4.3.3 Cookie管理

如果用户代理收到的Set-Cookie响应标头的NAME与预先存在的cookie相同,并且其Domain和Path属性值与预先存在的cookie完全匹配(字符串),则新cookie将取代旧cookie.

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

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

默认情况下,使用SecureHTTPS请求时创建JSESSIONID cookie .我想这就是Chrome不允许覆盖cookie的原因.但是,如果您尝试<secure>false</secure>web.xmlTomcat中设置忽略它并且Set-Cookie标头随之发送Secure

<session-config>
    <cookie-config>
        <http-only>true</http-only>
        <secure>true</secure>
    </cookie-config>
</session-config>
Run Code Online (Sandbox Code Playgroud)

更改cookie名称,设置sessionCookiePathUsesTrailingSlash或删除HttpOnly没有任何效果

我没有找到解决此问题的方法,除非在用户从HTTPS切换到HTTP时使服务器会话无效.

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


更新 此问题最终标记为"无法修复",因为它是故意更改.请参阅https://www.chromestatus.com/feature/4506322921848832

严格的安全Cookie

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


t1f*_*t1f 1

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

一个可能的解决方案可能是添加sessionCookiePathUsesTrailingSlash=falsecontext.xml看看效果如何。

有关此事的一些信息来自这里

在此输入图像描述

这里的讨论(相同的解决方案)

希望我没有混淆这些问题,这对您有帮助,如果我需要编辑/如果有效/如果我应该删除,请通过评论告诉我,谢谢!