我似乎无法找到解决问题的正确答案。我在互联网上找到的信息不知所措,我不知道该怎么做。
我的设置如下: Apache服务器(前端),Tomcat 6.0(后端),RapidSSL证书在Apache服务器上,我的网站组成Java Server Pages。
问题:
我有几个页面在https下,而其他网站页面在http下。
我的登录页面是https,我注意到当我登录并重定向到http页面时,会话没有被维护。它创建了一个新的,导致用户被发送到我的“会话过期”页面,当成功登录时,他们将被重定向到另一个页面。
的的问题:
当从https切换到http?
如何解决此问题? 我需要在http页面上创建的会话属性出现在https页面上,因此当用户再次被定向到http页面时,会话尚未重新创建,并且属性丢失。
为了帮助我解决这个问题,请向我询问您认为必要的任何问题。我非常感谢我收到的任何帮助。这个问题已成为我的绊脚石,特别是因为我显然缺乏自己解决问题的“专业知识”。
答案 0 :(得分:3)
允许用户在登录后使用同一会话是一个安全漏洞。默认情况下,Tomcat不允许会话从SSL迁移到非SSL页面。
您应该更改逻辑,以便在用户进行登录时,会话以静默方式更新,并登录而不是转到会话过期页面。
答案 1 :(得分:1)
您可能正在使用“安全cookie”来维护会话:这些cookie不会从HTTPS传播到HTTP。这通常是件好事。
您可以选择不这样做,但是当您将会话从HTTPS传输到HTTP时,您必须格外小心,以后不允许它在以后通过HTTPS重用,因为它可能已被泄露。
答案 2 :(得分:0)
您是否使用简单的反向代理连接到Tomcat?如果是这种情况,请使用mod_proxy_ajp
使用AJP
将Apache HTTP Server连接到Tomcat Application Server。
答案 3 :(得分:0)
我有同样的问题,网站的某些部分是https,有些是http。我发现使用Tomcat,通过http创建的会话cookie转移到https没有问题,但是当移动到http时,通过https创建的会话cookie会丢失。
我发现在用户访问网站时维护会话的一个解决方案是在用户第一次到达时将其弹回。我使用以下代码创建了一个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);
}