我最近注意到,当我重新启动Tomcat网络服务器时,Chrome浏览器无法再存储Cookie。即tomcat使用cookie进行http会话,浏览器无法再获取其http会话,我们用于存储登录用户的cookie也失败,用户不会保持登录状态。
这似乎是Chrome的一个新问题,也许来自最近的更新,我不记得以前见过它了。如果我关闭Chrome浏览器,然后重新打开它,则可以再次使用(直到再次重新启动服务器)。
这个问题在Firefox上没有发生,似乎是Chrome中的一个错误。
有没有人注意到这个问题,或者知道解决方案?
我发现了一些关于Chrome / tomcat cookie问题的帖子以及设置的建议, context.xml中的sessionCookiePathUsesTrailingSlash = false 但这并没有解决问题。
似乎它可能与支持https和http的网站有关,并且在两者之间切换(虽然它确实发生在不支持https的网站上......)
好的,我现在可以重新创建问题,步骤是。
此操作仅在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
答案 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
的问题的一些信息希望我没有混淆这些问题,这可以帮助你,如果我需要编辑/如果有效/如果我应该删除,请告诉我,谢谢!
答案 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知道:
如果安全https
条件使用默认"JSESSIONID"
。
如果不安全的http
条件使用"JSESSIONIDForHttp"
。