Servlet httpSession的问题描述与延伸



问题

通常情况下,我们实现同一个浏览器不同用户登录与不同浏览器同一个用户的登录处理如下:
8d61dbfbde395321a43bfb38ce8a4263.jpg
 
session存储<sessionId,<userId,UserInfo>>
 
1、同一个session不同用户(同一个浏览器登录不同用户)
先判断session是否存在,并取出,通过用户ID查找,发现此session没有此用户信息,那么在此session的value中新增一个userId,userInfo
 
2、不同session,同一个用户(多终端登录)
单台可以在session创建时存到一个map中,统计applicationContext中的session即可。
 
多台呢?(⊙o⊙)…这下懵逼了。。。 也许有人会说了,使用tomcat集群配置session共享啊,但是还不是最佳方案,请往下看。
 

问题延伸

 
渐渐的在互联网3V(海量Volume、多样Variety、实时Velocity)和3高(高并发,高可用,高可扩)环境下,传统老式的实现已经不能满足业务需求。于是,Spring Session出世了。
我们看下传统session的问题: 
  • 不能编写可水平扩展的原生云应用;
  • session只能保存在容器内存中,不易实现集群;
  • 当用户使用WebSocket发送请求的时候,不能够保持HttpSession处于活跃状态;
  • 在非Web请求的处理代码中,不能够访问session数据,比如在JMS消息的处理代码中;
  • 不支持每个浏览器上使用多个session;
  • 不能控制session id如何在客户端和服务器之间进行交换。
 
 
我们查看httpSession源码发现:
e48cbb0cba3fa21ff2ccdf90d6059606.jpg
我们看第一个javax.servlet.http包中的实现
96411ad69c858a08e407c81975709d5a.jpg
 
在2001年,Servlet 2.3规范引入了ServletRequestWrapper。它的javadoc文档这样写道,ServletRequestWrapper“提供了ServletRequest接口的便利实现,开发人员如果希望将请求适配到Servlet的话,可以编写它的子类。这个类实现了包装(Wrapper)或者说是装饰(Decorator)模式。对方法的调用默认会通过包装的请求对象来执行”。
所以,借助这些包装类就能编写代码来扩展HttpServletRequest,重载返回HttpSession的方法,让它返回由外部存储所提供的实现。

Spring Session

 
spring-session无缝替换应用服务器的request大概原理是:
1.自定义个Filter,实现doFilter方法
2.继承 HttpServletRequestWrapper 、HttpServletResponseWrapper 类,重写getSession等相关方法(在这些方法里调用相关的 session存储容器操作类)。
3.在第一步的doFilter中,new第二步自定义的request和response的类。并把它们分别传递到过滤器链 ;
4.把该filter配置到 过滤器链的第一个位置上。

spring session优势

 
传统的JavaEE session管理会有各种问题,这恰好是Spring Session所要试图解决的。
  • 编写可水平扩展的原生云应用。  
  • 将session所保存的状态卸载到特定的外部session存储中,如Redis或Apache Geode中,它们能够以独立于应用服务器的方式提供高质量的集群。
  • 当用户使用WebSocket发送请求的时候,能够保持HttpSession处于活跃状态。
  • 在非Web请求的处理代码中,能够访问session数据,比如在JMS消息的处理代码中。 
  • 支持每个浏览器上使用多个session,从而能够很容易地构建更加丰富的终端用户体验。
  • 控制session id如何在客户端和服务器之间进行交换,这样的话就能很容易地编写Restful API,因为它可以从HTTP 头信息中获取session id,而不必再依赖于cookie
需要说明的很重要的一点就是,Spring Session的核心项目并不依赖于Spring框架,所以,我们甚至能够将其应用于不使用Spring框架的项目中。
 
以上只是简单的谈下,详细的推荐大家看下专业文章:http://www.infoq.com/cn/articles/Next-Generation-Session-Management-with-Spring-Session/
 

 

(转载本站文章请注明作者和出处 思考者日记网|束洋洋个人博客 ,请勿用于任何商业用途)

『访问 思考者日记网404页面 寻找遗失儿童』

告知
  •     本站90%以上文章均属原创,部分转载已加上原作者出处。 如需转载本站文章请您务必保留本站出处!
  •     打广告评论者请自重,请为广大网友提供一个健康干净的网络空间。
  • 感谢主机屋提供网站空间;
  • 感谢万网阿里云提供域名解析;
  • 感谢EmpireCMS提供CMS系统;
  • 感谢bootstrap展示本站前端页面;
  • 感谢Glyphicons Halflings提供字体;
  • 感谢大家一直以来对本站的喜爱,感谢大家!
近期文章 建议与反馈