通过Spring Session实现Session集中管理

阅读原文


随着企业级JAVA应用的发展,目前这个领域已经出现了很大的革新,现代的发展趋势是微服务以及可水平扩展的原生云应用(Cloud native application)。在这样的发展趋势下,过去所使用的Session管理器的不足就暴露了出来。

        Spring Session为企业级JAVA应用的Session管理带来了革新,使得以下功能更加容易实现:

               1、编写可水平扩展的原生云应用

               2、将Session所保存的状态卸载到特定的外部Session存储中,如Redis或MemCache中,他们能够以独立应用服务器的方式提供高质量的集群

               3、当用户使用WebSocket发送请求的时候,能够保持HttpSession处于活跃状态

               4、在非Web请求的处理代码中,能够访问Session数据,比如在JMS消息的处理代码中

               5、支持每个浏览器上使用多个Session,从而能够很容易地构建更加丰富的终端用户体验

               6、控制Session ID如何在客户端和服务器之间进行交换,这样的话就能很容易地编写Restful API。因为他可以从HTTP头信息中获取Session ID,而不必再依赖于Cookie

    

         Spring Session实现思路

                Spring Session的实现是通过设计FIlter,将所有发送到应用服务器的请求都进行拦截,然后利用HttpServletRequestWrapper接管Session的创建和管理工作。

         

         Spring Session的架构

                1、Spring Session是通过HttpServletRequestWrapper接管Session的创建和管理工作,把Session信息存放到外部的中间存储中,而不是像传统的Session管理器那样吧Session信息存放在应用服务器中。Spring Session定义了一组标准的接口,可以通过这些接口间接地访问底层数据。同时Spring Session还定义了以下核心接口,针对不同的数据存储,它们需要分别实现。在Spring Session中已经默认实现了Session存储到Redis中的实现。

                       1)org.springframework.session.Session接口定义了Session的基本功能,如设置和移除属性。这个借口不关心底层技术,因此能够比servlet HttpSession适用于更广泛场景

                       2)org.springframework.session.ExpiringSession扩展了Session接口,提供了判断Session是否过期的属性。RedisSession是这个接口的一个实现

                       3)org.springframework.session.SessionRepository定义了创建、保存、删除已经检索Session的方法。将Session实例真正保存到数据存储的逻辑就是在这个接口的实现中进行编码的。例如,RedisOperationSessionRepository就是这个接口的一个实现,它会在Redis中创建、存储和删除Session

               2、在Spring Session对于HTTP协议的支持中,定义了HttpSessionStrategy接口以及两个默认实现,即CookieHttpSessionStrategy和HeaderHttpSessionStrategy,前者使用HttpCookie将请求与Session关联,后者使用HTTP header将请求与Session关联,让用户可以通过Cookie或者HttpHeader里获取Session ID。

               3、Spring Session对HTTP的支持是通过标准的Servlet Filter来实现的,这个filter必须要配置为拦截所有的Web应用请求,并且它应该是filter链中的第一个filter。Spring Session filter会确保随后调用javax.servlet.http.HttpServletRequest的getSession()方法时,都会放回Spring Session的HttpSession实例。

               4、Spring Session会为每个用户保留多个Session,这是通过使用名为“_s”的Session别名来实现的

                     

           Spring Session源代码:spring-session-master.zip

你可能感兴趣的:(Primeton,EOS)