【问题标题】:JSP - Not able to maintain session between http page and https pageJSP - 无法维护 http 页面和 https 页面之间的会话
【发布时间】:2010-10-26 17:54:18
【问题描述】:

我似乎无法为我的问题找到一个正确的答案。我在互联网上找到的信息让我不知所措,我不知道该怎么办。

我的设置如下: Apache 服务器(前端),Tomcat 6.0(后端),RapidSSL 证书在 Apache 服务器上,我的站点是组成的Java 服务器页面。

问题:
我有几个页面在 https 下,而其余的网站页面在 http 下。 我拥有的登录页面位于 https 下,我注意到当我登录并重定向到 http 页面时,会话没有得到维护。它创建了一个新的,这导致用户被发送到我的“会话过期”页面,而实际上,在成功登录后,他们将被重定向到另一个页面。

问题:
为什么从 https 切换到 http 时会话不保持?

我该如何解决这个问题? 我需要在 http 页面上创建的会话属性出现在 https 页面上,因此当用户再次被定向到 http 页面时,会话尚未重新创建,并且属性丢失。

请向我提出您认为有必要的任何问题,以帮助我解决这个问题。我非常感谢我收到的任何帮助。这个问题已成为我的绊脚石,尤其是因为我显然缺乏自己解决问题的“专业知识”。

【问题讨论】:

    标签: http session jsp tomcat https


    【解决方案1】:

    允许用户在登录后使用同一个会话是一个安全漏洞。默认情况下,Tomcat 不允许会话从 SSL 迁移到非 SSL 页面。

    你应该改变你的逻辑,所以如果用户正在登录,会话会被静默更新,并登录而不是转到会话过期页面。

    【讨论】:

    • 我能想到的最好的主意是重新创建丢失的会话 att,并在验证用户名/密码参数时执行此操作,这样页面的逻辑就不会认为会话已过期。这听起来合乎逻辑吗?
    • 我尝试了我的想法 - 我注意到当我第一次登录时,它成功了,但是当我在同一个会话中第二次注销并重新登录时,它就像它一样之前,发送我到会话过期。我还应该提到,我已经为我网站上的每个链接使用了 response.encodeURL()。我注意到,当我在 http 页面上时,http 类型的链接存在 JSESSIONID,但 https 链接没有。这会增加我的问题吗?
    【解决方案2】:

    您可能正在使用“安全 cookie”来维护会话:这些 cookie 不会从 HTTPS 传播到 HTTP。这通常是一件好事。

    您可以选择不执行此操作,但是当您将会话从 HTTPS 传输到 HTTP 时,您必须格外小心,不要让它在以后通过 HTTPS 重复使用,因为它可能已被泄露。

    【讨论】:

    • 我不相信我使用“安全 cookie”只是因为我没有在 Tomcat 上为此配置任何东西。我正在使用会话属性,仅此而已。
    • 安全 cookie 可能是默认设置(无论如何这都是明智的),请参阅@Byron Whitlock 的回答。
    【解决方案3】:

    您是否使用简单的反向代理连接到 Tomcat?如果是这种情况,请使用 mod_proxy_ajp 来使用 AJP 将 Apache HTTP Server 连接到 Tomcat 应用程序服务器。

    【讨论】:

    • 是的,我的服务器上正在使用 mod_ajp。它将 JSP 页面的请求连接/转发到 Tomcat...正确吗?
    • mod_ajp?你的意思是mod_proxy_ajp 还是mod_jk?尚不清楚这对 HTTPS 和 HTTP 之间的问题有何影响,即使与mod_proxy_http 相比也是如此。
    • 对不起,是的,是 mod_jk,不是 mod_ajp,我很抱歉。
    • @Bruno:是的,我的意思是mod_proxy_ajp。
    【解决方案4】:

    我有同样的问题,网站的某些部分是 https,有些是 http。我发现使用 Tomcat,通过 http 创建的会话 cookie 可以转移到 https 没有问题,但是通过 https 创建的会话 cookie 在迁移到 http 时会丢失。

    我发现在用户浏览网站时保持会话的一个解决方案是在用户第一次到达时反弹。我使用以下代码创建了一个 RequestFilter:

    if (request.isSecure() && session.isNew()) { // session cookie created over ssl
        try { session.invalidate(); }
        catch (Exception e) { /* handle error */ }
        String url = request.getRequestURI().replaceFirst("https", "http");
        response.sendRedirect(url);
    }
    else if (!request.isSecure()) {
        String url = request.getRequestURI().replaceFirst("http", "https");
        response.sendRedirect(url);
    }
    

    这会强制非 SSL 的新会话创建持久会话 cookie,然后一旦会话存在,用户就会转发回安全请求。这会导致会话保持活动状态。

    或者这里有一个涉及较少反弹的选项,只需用一个不安全的 cookie 覆盖会话 cookie:

    if (request.isSecure() && session.isNew()) {
        Cookie c = new Cookie("JSESSIONID", request.getSession().getId());
        c.setSecure(false);
        response.addCookie(c);
    }
    

    【讨论】:

      猜你喜欢
      • 2017-08-18
      • 2012-08-01
      • 1970-01-01
      • 2014-04-19
      • 1970-01-01
      • 2013-02-10
      • 1970-01-01
      • 2011-08-16
      • 2010-12-30
      相关资源
      最近更新 更多