`
java.guru
  • 浏览: 66385 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Https跳到http时session信息丢失的分析及解决方案

阅读更多


我们在YMU(website monitoring)项目开发过程中发现一个关于登录功能的奇怪的问题。


当按一般流程使用登录功能时是没问题的,即:点击官网 (http://YouMonitor.Us)的login链接,然后跳转到https://YouMonitor.Us/login.shtml,输入正确的用户名和密码后,则能正确转入功能页面(http协议)。


而如果跳过第一步,直接在浏览器中输https://YouMonitor.Us/login.shtml,则不能正确转入功能页面。

 

原因分析

经调试发现是由于session造成的。当用户名和密码通过验证后,YMU会在session中保存登录用户名。

 

在第二种方式下,用户名被保存在https下创建的session中,而不能被传递到http协议,这样当以http协议跳转到功能页面时,发现session中没有用户名,系统就会认为没有登录,就出问题了。

再深入分析session的传递机制,其中一种方式是通过JSESSIONID这个cookie在浏览器和web server之间进行传递的。而为了增强安全性,从tomcat 4.0开始,在https协议下生成的cookie不会被传递到http协议。
这就是登录问题产生的根本原因。

 

解决方案

前一段时间在网上找到一种解决方法,该方法修改tomcat的源代码,以解除cookie传递的限制。该方法的缺点是每次tomcat升级都要重新修改并编译,很不方便。

还有没有更方便的方法呢?上周公司一同事在网上又找到一个更加简洁和方面的方法。其主要思路是建立一个filter, 对所有的Servlet Request做处理,如果session是新的https session,则创建一个JSESSIONID cookie,并设置到Servlet Response中,这样就突破了tomcat的限制,把https下的session传递到http协议下。

根据文章说明试了一下,果然成功了!这下解决了系统的一个BUG,不错啊!

附:源代码

 

1. 先建立Wrapper类,用于处理所有的Serverlet Request:

public class MyRequestWrapper extends HttpServletRequestWrapper{
private HttpServletResponse response = null;

public MyRequestWrapper(HttpServletRequest request) {
super(request);
}

public void setResponse(HttpServletResponse response) { this.response = response;}

public HttpSession getSession(){
HttpSession session = super.getSession();
processSessionCookie(session);
return session;
}

public HttpSession getSession(boolean create){
HttpSession session = super.getSession(create);
processSessionCookie(session);
return session;
}

private void processSessionCookie(HttpSession session){
if (null == response || null == session) {
// No response or session object attached, skip the pre processing
return;
}

// cookieOverWritten - 用于过滤多个Set-Cookie头的标志
Object cookieOverWritten = getAttribute("COOKIE_OVERWRITTEN_FLAG");
if (null == cookieOverWritten && isSecure() && isRequestedSessionIdFromCookie() && session.isNew()) {
// 当是https协议,且新session时,创建JSESSIONID cookie以欺骗浏览器

Cookie cookie = new Cookie("JSESSIONID", session.getId());
cookie.setMaxAge(-1); // 有效时间为浏览器打开或超时
String contextPath = getContextPath();
if ((contextPath != null) && (contextPath.length() > 0)) {
cookie.setPath(contextPath);
}
else {
cookie.setPath("/");
}

response.addCookie(cookie); // 增加一个Set-Cookie头到response
setAttribute("COOKIE_OVERWRITTEN_FLAG", "true");// 过滤多个Set-Cookie头的标志
}
}

}

2. 再把上述Wrapper类与Filter建立关联:

public final class TestFilter implements Filter{
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
MyRequestWrapper myrequest = new MyRequestWrapper(request);
myrequest.setResponse(response);
chain.doFilter(myrequest, response);
}
}

 

分享到:
评论
4 楼 dohkoos 2008-04-17  
to wliang950:
你可以到这个去看看http://dohkoos.name/?p=457
3 楼 wliang950 2008-03-12  
上面的代码好象有问题吧。。
有没有测试过的完成的代码发一份啊。。
我才开始学。。。就不耻下问了啊!~~
2 楼 java.guru 2008-01-24  
实际上不管在https,还是http写一下,web server都会创建session。Web server与浏览器之间可以通过cookie(JSESSIONID)或url(增加jessionid参数)这两种方法传递session信息。

从Tomcat4.0开始,增强了安全性,web server不会把https下创建的session以cookie形式传给http response。而文章中方法,当是新的https session时,创建一个JSESSIONID的cookie,并设置到http resonse中,这样当从https转到http时,http response中有了JSESSIONID,因此就没有问题了。

另外,在http->https->http这种方式下,session是第一次Http访问时创建的,在协议转换时,tomcat能正确地传递JSESSIONID。
1 楼 wliang950 2008-01-23  
当按一般流程使用登录功能时是没问题的,即:点击官网 (http://YouMonitor.Us)的login链接,然后跳转到https://YouMonitor.Us/login.shtml,输入正确的用户名和密码后,则能正确转入功能页面(http协议)。


你好,我想请教一下。
你的上面这种方式是怎么实现的?
1>http--->https?怎么让web服务器支持https和http共存?
2>https-->http   如你上面说的 在https下输入信息,验证后能正确转入http下。。不是存在跨协议间session不能共存的问题吗?

斑竹方便的话希望能帮忙解答一下。。谢谢!!!!

相关推荐

    完美解决ajax访问遇到Session失效的问题

    现在Ajax在Web项目中应用广泛,几乎可以说无处不在,这就带来另外一个问题:当Ajax请求遇到Session超时,应该怎么办? 显而易见,传统的页面跳转在此已经不适用,因为Ajax请求是XMLHTTPRequest对象发起的而不

    session丢失解决方法

    ### Session丢失解决方法 在ASP.NET开发过程中,经常会遇到一种情况:当对网站进行某些特定操作(如修改或删除站内目录)时,原本正常的Session会突然失效或丢失。这不仅影响用户体验,还可能导致一系列安全性和...

    解决[removed].href之后session丢失的问题

    本文将探讨这个问题的原因及解决方案。 首先,我们需要理解`window.location.href`的工作原理。它是JavaScript中用于改变当前窗口或框架的URL并加载新文档的属性。当调用`window.location.href`时,浏览器会发起一...

    session过期问题

    **Session过期问题的常见场景及解决方案** 1. **用户长时间未操作**:设置合理的Session超时时间,同时考虑采用心跳检测来保持用户在线状态。 2. **用户浏览器关闭**:浏览器关闭后Session丢失,再次打开时应判断...

    PHP Session变量不能传送到下一页的解决方法

    本文将深入解析这个问题的原因,并提供解决方案。 首先,我们要理解Session的工作原理。Session数据通常存储在服务器端,而客户端通过一个称为Session ID的唯一标识符与特定的Session数据关联。这个Session ID通常...

    Oracle数据库非常规恢复方案.pptx

    Oracle数据库的非常规恢复方案是针对那些常规方法无法解决的恢复场景而设计的。这些方案通常涉及对数据库的深入操作,包括使用特定的工具、隐含参数和事件,以克服如控制文件问题、数据文件损坏、redo日志异常等挑战...

    Windows XP Sp3下安装WINCC V62常见问题及解决方法-【word】可编辑.doc

    在Windows XP Service Pack 3 (Sp3)...在安装过程中,遵循安装向导的提示,并在遇到问题时参考上述解决方案,通常能成功解决大部分安装问题。此外,保持操作系统和所有软件的更新以确保兼容性和安全性是至关重要的。

    tomcat集群

    总结来说,Tomcat集群通过整合多个实例,提供了一种强大的解决方案,以应对高流量和高可用性的需求。正确配置和管理Tomcat集群,对于提升Web应用的稳定性和效率至关重要。在实际操作中,应根据具体业务需求选择合适...

    apache2.2+mod_JK+Tomcat7+Terracotta3.7 集群(重要)

    在Tomcat集群中,Terracotta可以实现session复制和共享,确保用户在集群中的任意节点之间切换时,其会话状态保持一致,避免了session丢失的问题。 集群配置文件tc-config.xml是Terracotta的配置文件,用于定义集群...

    华为数通bfd.rar

    6. **实验报告内容预测**:实验报告可能包括实验目的、设备配置、BFD会话建立过程、故障模拟与恢复测试、性能评估等内容,以及可能遇到的问题和解决方案。 **标签“网络bfd”解析** “网络bfd”标签进一步确认了...

    深圳-银盛支付-Java中级面试.pdf

    它提供了开箱即用的微服务解决方案,使得开发者能够轻松地实现服务治理和服务间的通信等功能。 - **Eureka**:作为服务注册与发现组件,Eureka 在 Spring Cloud 生态系统中扮演着核心角色。当服务启动时,每个服务...

    页面跳转问题页面跳转问题页面跳转问题

    四、解决方案 为了解决页面跳转问题,可以采取以下几种措施: (1)使用ViewState 或者 Session 对象来保存页面状态,避免数据丢失。 (2)正确地处理参数传递,例如使用 Request.QueryString 对象来获取页面参数...

    rtsp.rar_pudn rtsp_rtsp client_rtsp-tcp_rtsp客户端_rtsp客户端代码

    - 解码和编码过程也是源代码的关键部分,可能涉及到SDP(Session Description Protocol)信息的处理。 7. 应用场景: - RTSP广泛应用于视频监控、在线直播、VoIP(Voice over IP)等实时媒体传输领域。 - 结合...

    ASP.NET跳转页面3种方法比较

    - **数据丢失**:跳转后,服务器端的状态信息,如View State,会被清除,因此如果需要传递数据,需使用Session或其他持久化存储。 - **无法绕过登录保护**:如果目标页面设置了登录验证,用户必须进行身份验证才能...

    GB28181与海康NVR通信内部文档

    文档可能提供调试技巧和常见问题解决方案,以帮助开发者高效地完成集成工作。 9. **安全性考虑** GB28181协议中包含了安全机制,如TLS/SSL加密,保证数据传输的安全性。海康NVR在实现GB28181时也应注重网络安全,...

    paho.mqtt.c-1.3.0.zip

    Paho MQTT C库是针对C语言编写的,为开发者提供了一种在各种嵌入式系统和微控制器上实现MQTT协议的解决方案。 **MQTT协议核心概念** 1. **发布/订阅模型**:在MQTT中,数据传输基于发布者和订阅者的模式。发布者...

    MQTT中英文版本协议文档

    MQTT(Message Queuing Telemetry Transport)是一种轻量级、发布/订阅模式的网络协议,主要设计用于低带宽...通过深入学习MQTT协议,开发者可以更好地构建和优化物联网解决方案,确保数据在复杂网络环境下的高效传输。

    IOT网关设计与实现-工业一体机(5)配套源码

    在本文中,我们将深入探讨"IOT网关设计与实现-工业一体机(5)配套源码"的主题,重点关注Session管理、心跳管理、数据上行和数据下行...理解并掌握这些关键技术,对于从事物联网解决方案开发的专业人士来说是必不可少的。

    为什么每次开机总是检查D盘_如何解决(免费下载)

    - 当Windows检测到某个磁盘驱动器存在文件系统错误时,系统会在下次启动时自动运行磁盘检查。 - 如果系统日志记录了该磁盘上的某些错误,则也会触发自动磁盘检查。 - 用户可以通过命令行手动设置或取消特定驱动器的...

Global site tag (gtag.js) - Google Analytics