在Tomcat上切换HTTP和HTTPS时出现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

我正在研究一个场景,在这个场景中,站点同时存在于HTTP和HTTPS上

当用户登录到HTTPS站点时,JSESSIONID的“安全”cookies存储在浏览器中。如果用户关闭浏览器并返回(这次希望使用HTTP登录),用户将无法登录,因为浏览器不会在浏览器中存储新的“不安全”JSESSIONID,也不会将以前存储的安全cookie发送到服务器

我的问题是:

  • 有没有一种方法,当用户使用HTTP登录时,服务器可以发送新的“不安全”cookie,并将现有的“安全”cookie转换为具有新值的“不安全”cookie

  • 有没有办法让Tomcat在安全和不安全连接中为JSESSIONID使用不同的cookie名称

  • 我试图在互联网上查找,但似乎没有办法做到这一点。在这种情况下,最终用户可能会认为该站点不工作

    注意:
    是的,我们可以强制用户始终使用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。例如,见