zoukankan      html  css  js  c++  java
  • Spring Session Data Redis实现session共享

    1.前言

      在开发中遇到一个关于用户体验的问题,每次当运维进行更新重启服务器时,都会导致会员平台中已登录的用户掉线。这是因为每个用户的会话信息及状态都是由session来保存的,而session对象是由服务器创建,并把session的Id以cookie的形式发送给客户端浏览器的(每个会话都有一个单独的sessionID)。当这个对象超过一定时间没有被使用或者服务器重启时,对象就会被销毁,也就导致了用户掉线。

    2.解决办法

      在解决问题过程中发现,只要记住了刚才用户的sessionID,重启服务器后仍使用原来的id,就不会掉线,也就是说要保证session不被改变才可以保持用户的登录状态。在这里使用了Spring Session Data Redis来实现session的共享(redis:高速缓存数据库),也就是说使用redis对session进行一个持久化操作(用mysql等数据库来单独存储session有点浪费了,速度也没有redis快),当服务器重启时,可以从redis中反序列化取出session,重新获取用户会话信息。

      简要配置步骤:

      (1)pom.xml加入依赖:spring-session-data-redis、spring-session,当然前提要有spring(4.3.5)、redis的依赖(redis使用了3.0版本)

     1 <dependency>
     2     <groupId>org.springframework.session</groupId>
     3     <artifactId>spring-session-data-redis</artifactId>
     4     <version>1.3.2.RELEASE</version>
     5 </dependency>
     6 <dependency>
     7     <groupId>org.springframework.session</groupId>
     8     <artifactId>spring-session</artifactId>
     9     <version>1.3.2.RELEASE</version>
    10 </dependency>

      (2)applicationContext.xml配置文件中增加RedisHttpSessionConfiguration(下面是单独的配置文件,然后import进去)

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <beans xmlns="http://www.springframework.org/schema/beans"
     3        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     4        xmlns:p="http://www.springframework.org/schema/p"
     5        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
     6     <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig" >
     7         <property name="maxIdle" value="0" />
     8         <property name="maxTotal" value="20" />
     9         <property name="maxWaitMillis" value="1000" />
    10         <property name="testOnBorrow" value="true" />
    11     </bean>
    12 
    13     <!-- redis连接配置,依次为主机ip,端口,是否使用池,(usePool=true时)redis的池配置 -->
    14     <bean id="connectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"
    15           p:host-name="0.0.0.0" p:port="1111" p:database="10" p:pool-config-ref="jedisPoolConfig">
    16     </bean>
    17 
    18     <!-- 配置spring-session -->
    19     <bean class="org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration">
    20         <!-- 过期时间100分钟 -->
    21         <property name="maxInactiveIntervalInSeconds" value="6000"></property>
    22     </bean>
    23 </beans>

      (3)web.xml中配置filter、session超时时间

     1 <filter>
     2     <filter-name>springSessionRepositoryFilter</filter-name>
     3     <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
     4 </filter>
     5 <filter-mapping>
     6     <filter-name>springSessionRepositoryFilter</filter-name>
     7     <url-pattern>/*</url-pattern>
     8 </filter-mapping>
     9 <session-config>
    10     <!--60*60*24-->
    11     <session-timeout>86400</session-timeout>
    12 </session-config>

      配置完成后,基本就可以实现Session的共享了,重启服务器测试,已经登录的用户也不会发生掉线的情况了。

    最后贴几个参考链接:

    session原理及实现共享

    Spring Session Data Redis 配置中遇到的坑

    集群/分布式环境下5种session处理策略

    文章仅供参考,转载请注明出处。
    不怕千万人阻挡,只怕自己投降。
  • 相关阅读:
    JVM内存参数详解以及配置调优
    Sublime Text 3安装AngularJS插件
    GraphicsMagick安装&make命令使用
    清明节太原两日游
    Java异常处理机制 try-catch-finally
    成都一日游
    降低PNG图片存储大小方法、图片压缩方法
    Windows 10下mysql 64位 安装(mysql-5.7.11-winx64安装)
    解决-Dmaven.multiModuleProjectDirectory system property is not set. Check $M2_HOME environment variabl
    centos 7下Hadoop 2.7.2 伪分布式安装
  • 原文地址:https://www.cnblogs.com/jakeylove3/p/8475508.html
Copyright © 2011-2022 走看看