打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
基于Spring Session实现Session的分布式管理

Spring Session作为Spring社区官方推荐的一个比较简单快速的Java Web分布式session解决方案,帮我们搞定了长期以来比较蛋疼的session分布式的问题。


Spring Session解决的基本思路很简单,即将用户的session信息全部存放到一个redis数据库中,所有的session都从这个数据库拿。由于redis是一个内存数据库,数据信息读写是非常快速的。如此一来,多个Tomcat,共用一个redis数据库,即实现了session的共享问题。

工具/原料

  • Spring Session
  • Redis

方法/步骤

  1. 1

    访问Spring Session官方网站:

    在百度中查询Spring Session即可找到Spring Session的官方站点。

    目前版本为1.0.2,1.0.3版本处于snapshot状态。

    Spring指出,Spring Session具有如下能力:

    (1) API and implementations for managing a user's session

    (2) HttpSession - allows replacing the HttpSession in an application container (i.e. Tomcat) neutral way

    (2-1)Clustered Sessions - Spring Session makes it trivial to support clustered sessions without being tied to an application container specific solution.

    (2-2)Multiple Browser Sessions - Spring Session supports managing multiple users' sessions in a single browser instance (i.e. multiple authenticated accounts similar to Google).

    (2-3)RESTful APIs - Spring Session allows providing session ids in headers to work with RESTful APIs

    (3) WebSocket - provides the ability to keep the HttpSession alive when receiving WebSocket messages

  2. 对Spring Session有了基本了解之后,可以开始配置Maven的pom.xml,导入SpringSession的jar包

    Spring官方文档指出,要使用Spring Session,配置如下依赖即可:

    <dependency>

               <groupId>org.springframework.session</groupId>

                <artifactId>spring-session-data-redis</artifactId>

                <version>1.0.2.RELEASE</version>

    </dependency>

    实际上,spring-session-data-redis并不是一个实际的jar包,只不过它配置了其他的四个依赖:

  3. Spring-session-data-redis是一个空的包,我们可以从如下截图中看出。Spring-session-data-redis仅仅只有一个META-INF文件夹。它的作用就在于引入其他四个包。

  4. 当然,实际上你也可以不配置spring-session-data-redis,而直接配置实际上导入的类:

    <!-- Redis -->

    <dependency>

        <groupId>org.springframework.data</groupId>

        <artifactId>spring-data-redis</artifactId>

        <version>1.4.2.RELEASE</version>

    </dependency>

     

    <dependency>

        <groupId>redis.clients</groupId>

        <artifactId>jedis</artifactId>

        <version>2.5.2</version>

    </dependency>

     

    <!-- Spring Session -->

    <dependency>

           <groupId>org.springframework.session</groupId>

           <artifactId>spring-session</artifactId>

           <version>1.0.2.RELEASE</version>

    </dependency>

     

    <dependency>

          <groupId>org.apache.commons</groupId>

          <artifactId>commons-pool2</artifactId>

          <version>2.2</version>

    </dependency>

    我们这里,首先,配置spring-data-redis和jedis,这样,就可以使用spring-data-redis框架,来实现访问redis数据库。

    spring-data-redis是spring的一个子项目,和spring-session一样。spring-session要访问redis,这里spring-session依赖spring-data-redis,来实现操作reids数据库。

  5. Spring Core、Spring Web需要配置4.x版本。

    当然,Spring Session还需要把Spring Web等常见的Spring包引入。Spring Session 1.0.2依赖Spring的版本为4.1.6以上,因此,3.x版本的Spring是无法使用的:

    可以从Maven Repository查看依赖情况:http://mvnrepository.com/artifact/org.springframework.session/spring-session/1.0.2.RELEASE

    此外,注意javax.servlet-api需要3.0.1版本以上。

  6. 配置application-context.xml文件

    这里,我们以使用xml配置方式为例,当然也可以使用注解配置,详见SPring的官方例子(见参考资料)

    备注:xml的配置方法官方给出了一个例子:http://docs.spring.io/spring-session/docs/1.0.2.RELEASE/reference/html5/guides/httpsession-xml.html

    在application-context.xml文件中,加入:

    <context:annotation-config/> 

    <bean class="org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration"/>  

    <bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig" />    

    <bean id="connectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" p:host-name="${redis.host}" p:port="${redis.port}" p:password="${redis.pass}"  p:pool-config-ref="poolConfig"/>

    其中,${redis.host}等即redis数据库的服务器地址,端口,密码等信息,放在properties文件中即可。

  7. 修改web.xml,加入Spring Session的Filter

    在web.xml文件中,加入:

    <filter>     

        <filter-name>springSessionRepositoryFilter</filter-name>     

        <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>

    </filter>

    <filter-mapping>     

        <filter-name>springSessionRepositoryFilter</filter-name>     

        <url-pattern>/*</url-pattern> 

    </filter-mapping>

    这样,所有的请求,都会被DelegatingFilterProxy处理,实际上,DelegatingFilterProxy会找到springSessionRepositoryFilter,创建它。每一次的请求还是由springSessionRepositoryFilter来过滤的。

    The DelegatingFilterProxy will look up a Bean by the name of springSessionRepositoryFilter and cast it to a Filter. For every request that DelegatingFilterProxy is invoked, the springSessionRepositoryFilter will be invoked.

    这里,Spring加入了一个Filter,其本质是:对每一个请求的request进行了一次封装。那么,在Controller里面拿出的request实际上是封装后的request,

    调用request.getSession()的时候,实际上拿到是Spring封装后的session。这个session则存储在redis数据库中。

  8. 访问Web项目,查看session

    访问Web项目,这个时候,使用redis-cli进入redis命令操作界面,在使用keys *可以查看所有的key:

  9. 第一个是当前访问的用户的session信息,第二个保存的是过期的时间。

    可以查看session的详细内容如下:

  10. 可以看出,session对象被序列化后存入。因此,所有放入session的对象,都要实现Serializable接口。比如,我将所有的用户信息,封装到一个Authentication对象,那么

    这对象就必须实现Serializable接口:

  11. 补充一下:

    如果要设置Session的过期时间,通常我们会在web.xml文件中进行设置:

    但是,使用Spring Session托管session后,这里的设置将会失效。我们要专门为Spring Session进行设置:

    将application-context.xml,即步骤4中的的RedisHttpSessionConfiguration,设置其maxInactiveIntervalInSeconds属性即可。注意,maxInactiveIntervalInSeconds的的单位是秒! 如下将设置session为10分钟过期!

    <bean class="org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration">

            <property name="maxInactiveIntervalInSeconds" value="600"></property>

    </bean>



本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Spring的applicationContext.xml文件
使用websocket遇到的一个小问题 The remote endpoint was in state [TEXT
[互联网] 利用springsession解决共享Session问题 | 软件世界网
单点登录与消息队列以及在J2EE中的实现方案 – 码农网
spring-session Redis实现Session共享
spring boot 实际应用(六) session共享问题
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服