Spring MVC 使用 Spring Session 实现 Session 共享-Redis

使用Spring Session 通过 Redis 实现 Session 共享,用于多实例应用

 Session 共享的简单原理

用户第一次访问应用时,应用会创建一个新的 Session,并且会将 Session 的 ID 作为 Cookie 缓存在浏览器,下一次访问时请求的头部中带着该 Cookie,应用通过获取的 Session ID 进行查找,如果该 Session 存在且有效,则继续该请求,如果 Cookie 无效或者 Session 无效,则会重新生成一个新的 Session
在普通的 JavaEE 应用中,Session 信息放在内存中,当容器(如 Tomcat)关闭后,内存中的 Session 被销毁;重启后如果当前用户再去访问对应的是一个新的 Session ,在多实例中无法共享,一个用户只能访问指定的实例才能使用相同的 Session;
Session 共享实现的原理是将原来内存中的 Session 放在一个需要共享 Session 的实例都可以访问到的位置,如数据库,Redis 中等,从而实现多实例 Session 共享
实现共享后,只要浏览器的 Cookie 中的 Session ID 没有改变,多个实例中的任意一个被销毁不会影响用户访问

 Redis 方式实现

将 Session 对象序列化存储到 Redis 中,多个实例访问时都会使用该 Session,Spring Session 会管理 Session 信息的管理,无需其他操作

  1. 添加依赖

  • 在 pom.xml 文件里面添加如下依赖
           <dependency>
            <groupId>redis.clients</groupId>
                <artifactId>jedis</artifactId>
                <version>2.9.0</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.data</groupId>
                <artifactId>spring-data-redis</artifactId>
                <version>1.8.7.RELEAS</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.session</groupId>
                <artifactId>spring-session</artifactId>
                <version>1.3.1.RELEASE</version>
            </dependency>

    2. 添加配置

  • SpringConfig.xml 添加如下配置,如果已经配置了JedisConnectionFactory,可忽略
<!-- Spring Session共享 -->
<bean class="org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration"/>
<bean class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
        <property name="hostName" value="localhost"/>
        <property name="password" value="123456"/>
        <property name="port" value="6379"/>
        <property name="database" value="3"/>
</bean>

3. 添加过滤器

  • 在 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>

    该过滤器必须是第一个过滤器,所有的请求经过该过滤器后执行后续操作

bug记录:spring1.x和spring2.x session不共享问题

两个需要共享session的服务,服务A采用是传统的springMVC配置,版本应该是spring1.x,而服务B,采用是springboot2.x架构,两者在配置完session共享后,会出现session不共享的情况,也就是两个系统获取到的sessionid不一致,原因是:

导致session不一致原因是1.x useBase64Encoding=false 而 2.0 为useBase64Encoding=true

因此解决只需保证两边 useBase64Encoding 一致就行。

spring2.x程序增加配置:

@Bean
public CookieSerializer cookieSerializer() {
	DefaultCookieSerializer cookieSerializer = new DefaultCookieSerializer();
	cookieSerializer.setUseBase64Encoding(false);
	return cookieSerializer;
}

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值