首页 > 其他分享 >Https跳到http时session信息丢失的分析及解决方案

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

时间:2023-06-09 11:02:16浏览次数:34  
标签:http Https public session cookie https response


http://java-guru.javaeye.com/blog/157897


关键字: 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);
 }
}

 


标签:http,Https,public,session,cookie,https,response
From: https://blog.51cto.com/u_16065168/6445918

相关文章

  • Python 协程池,异步IO非阻塞式,http 请求
    先写个FlaskdemoimporttimefromflaskimportFlaskapp=Flask(__name__)@app.route('/<id>')defhello(id):time.sleep(2)return'Hello,World!:%s'%idif__name__=='__main__':app.run()协程请求import......
  • url中的jsessionid解释
    url中的jsessionid解释(1)这是一个保险措施因为Session默认是需要Cookie支持的但有些客户浏览器是关闭Cookie的这个时候就需要在URL中指定服务器上的session标识,也就是5F4771183629C9834F8382E23BE13C4C用一个方法(忘了方法的名字)处理URL串就可以得到这个东西这个方法......
  • jmeter-http请求中post请求
    1、选择取样器-http请求,填写完整web服务器信息、http请求选择post、路径写请求路径(注意从/开始)2、2.1post请求数据为map格式(键值对),直接将键值对添加到参数表中即可 2.2post请求数据为json格式,将json格式的请求数据加到bodydata中,在请求头文件中添加Content-Type的值为appli......
  • 如何用get方式、post方式向http接口发送数据
    1.项目环境如下:myeclipse6.5、tomcat5.0、system:xp、JDK:开发1.5,编译1.4为了方便,在原来的web项目UpDown中新建了一个httpcall包,用来保存http接口和调用的客户端。2.准备需要的jar包*commons-httpclient-3.0.jar*commons-logging.jar*commons-codec-1.3.jar......
  • Using Redis Cache for session data storage in ASP.NET Core
    reference: https://docs.microsoft.com/en-us/aspnet/core/performance/caching/distributed?view=aspnetcore-6.0Postedon:11-12-2017TweetWhenyourunanappindevelopmentortesting,itcanbeokayforsessiondatatobelostduringapprestarts.However,in......
  • jmeter-http信息头管理器
    将requestheads中的键值对统一放到配置元件-http信息头管理器中http信息头管理器分为两种公共的、私有的如果是统一添加的直接添加一个公共的http信息头管理器即可;如果请求的头文件中有特殊的键值对,那么单独在请求下添加一个http信息头管理器即可 ......
  • HTTP请求中GET请求为何有长度限制?
    HTTP协议并没有规定GET请求URL的长度限制,但是实际上在使用中会存在长度限制。造成GET请求URL长度限制的原因主要有以下两点:浏览器限制。不同的浏览器对URL长度的限制不同,一般来说,在地址栏中输入的URL长度范围在2,000个字符左右,超过这个长度可能会被浏览器截断。......
  • HTTP1\2\3 和 https 分别是什么?
    http1,http2http3和https有什么区别HTTP/1.0和HTTP/1.1是早期的HTTP协议版本,而HTTP/2(也称为HTTP/2.0)和HTTP/3(也称为QUIC)是后续的协议版本。以下是它们之间的主要区别:HTTP/1.x:HTTP/1.x是一种基于文本的协议,使用明文传输数据。每个请求都需要建立一个新的连接,并且请求和响应......
  • c# HttpClient超时重试
    //调用方式3秒后超时重试2次.netframework4.5HttpMessageHandlerhandler=newTimeoutHandler(2,3000);using(varclient=newHttpClient(handle......
  • 安装配置Apache支持https和fcgi
     Apache安装及配置1.1 下载软件1、Apr :(wget http://mirrors.hust.edu.cn/apache//apr/apr-1.5.1.tar.gz)2、Apr-util :(wget http://mirrors.hust.edu.cn/apache//apr/apr-util-1.5.4.tar.gz)3、Pcre :(wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre......