在Tomcat上切换HTTP和HTTPS时出现Cookie问题
我正在研究一个场景,在这个场景中,站点同时存在于HTTP和HTTPS上 当用户登录到HTTPS站点时,JSESSIONID的“安全”cookies存储在浏览器中。如果用户关闭浏览器并返回(这次希望使用HTTP登录),用户将无法登录,因为浏览器不会在浏览器中存储新的“不安全”JSESSIONID,也不会将以前存储的安全cookie发送到服务器 我的问题是:在Tomcat上切换HTTP和HTTPS时出现Cookie问题,tomcat,cookies,session-cookies,Tomcat,Cookies,Session Cookies,我正在研究一个场景,在这个场景中,站点同时存在于HTTP和HTTPS上 当用户登录到HTTPS站点时,JSESSIONID的“安全”cookies存储在浏览器中。如果用户关闭浏览器并返回(这次希望使用HTTP登录),用户将无法登录,因为浏览器不会在浏览器中存储新的“不安全”JSESSIONID,也不会将以前存储的安全cookie发送到服务器 我的问题是: 有没有一种方法,当用户使用HTTP登录时,服务器可以发送新的“不安全”cookie,并将现有的“安全”cookie转换为具有新值的“不安全”c
是的,我们可以强制用户始终使用HTTPS。事实上,这就是我们正在努力做的。但是,我们在web应用程序中有一个禁用HTTPS的选项。所以,这就是正在发生的事情——用户认为“这个应用程序迫使我使用HTTPS,我不想使用它。让我禁用它”。要禁用HTTPS,用户以HTTPS版本登录站点,禁用HTTPS端口-这会触发服务器重启。用户现在访问HTTP站点-但她无法登录,因为用户从未注销HTTPS会话-并且这些cookie仍然存在。这被视为可用性问题,我正试图找到解决办法。Tomcat将允许在没有安全通道的情况下进行身份验证 如果请求遇到“安全”通道,或者
WEB-INF/WEB.xml
中的
指示容器使用安全cookie,Tomcat将仅创建设置了“安全”标志的cookie
您必须以某种方式配置Tomcat或您的应用程序,以导致非安全登录失败
服务器无法在客户端上重新写入cookie以将“安全”cookie更改为“非安全”cookie。将根据cookie处理规则处理具有相同主机名和路径的同名cookie(例如,
JSESSIONID
)。我建议阅读更多信息。我最终为HTTP和HTTPS站点创建了单独的cookie名称
由于我们的应用程序已打包并提供给客户,因此他们可以选择关闭HTTP或HTTPS。当打开HTTPS时,我们将所有HTTP用户重定向到各自的HTTPS站点。当客户管理员决定禁用HTTPS时,问题就会出现,然后,一些一直使用HTTPS且未明确注销系统的用户,他们被浏览器缓存中的安全cookie卡住,无法从HTTP站点登录到系统。解决方法当然是清除浏览器缓存,但为了避免支持调用,我们试图找到对用户透明的东西
当站点启用HTTPS时,我们可以使用设置Tomcat会话cookie名称为JSESSIONID_HTTPS
。这是我要说的要点:
ServletContext sc = ....
SessionCookieConfig cookieConfig = sc.getSessionCookieConfig();
if (isHttpsEnabled) {
cookieConfig.setName("JSESSIONID_HTTPS");
} else {
cookieConfig.setName("JSESSIONID_HTTP");
}
谢谢-经过大量的尝试和错误,我意识到安全cookie不能从不安全的HTTP连接中被覆盖/删除。已经有一些努力来构建一个WAR,以便于在应用程序中几乎自动地使用Let's Encrypt。例如,见