基于Spring Boot-Spring Session-Redis的分布式Session共享解决方案
分布式Web网站一般都会碰到集群session共享问题,之前也做过一些Spring3的项目,当时解决这个问题做过两种方案,一是利用nginx,session交给nginx控制,但是这个需要额外工作较多;还有一种是利用一些tomcat上的插件,修改tomcat配置文件,让tomcat自己去把Session放到Redis/Memcached/DB中去。这两种各有优缺,也都能解决问题。
但是现在项目全线Spring Boot,并不自己维护Tomcat,而是由Spring去启动Tomcat。这样就会有一个问题:在服务器上并不存在一个持久存在的Tomcat程序,这样也无从去修改Tomcat的配置文件了。经过了一番搜索,发现Spring果然对这个问题有自己的解决方案,那就是Spring-Session.
Spring-Session是通过过滤器实现的session共享,具体原理可以自己去官网查,这里只说一下如何配置。整个项目基于Spring Boot,如果不是Boot项目就需要自己去调整了。
项目需要先准备一个Redis服务,在本地启动一个即可。还需要有一个已经使用session但是未做session共享的Spring Boot项目,下面我就讲述一下如何给这个项目加上基于redis的session共享。
引入redis和spring-session对应的jar包:
[code] <dependency> <groupId>org.springframework.session</groupId> <artifactId>spring-session-data-redis</artifactId> </dependency> <!-- springboot 集成redis --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-redis</artifactId> <version>1.0.1.RELEASE</version> </dependency>
2.配置redis服务
在项目目前在使用的properties文件中,加入如下配置:
[code] spring.redis.database=0 spring.redis.host=127.0.0.1 spring.redis.port=6379 spring.redis.password= #连接池最大连接数 spring.redis.pool.max-active=8 #连接池最大阻塞时间:负数表示没有限制 spring.redis.pool.max-wait=-1 #最大空闲链接数 spring.redis.pool.max-idle=8 #最小空闲链接数 spring.redis.pool.min-idle=0 #连接超时的时间(ms) spring.redis.timeout=0
3.spring配置:
在项目的目录中,创建一个Config.java文件(名称随意)
[code]@Configuration @EnableRedisHttpSession public class Config { @Bean public JedisConnectionFactory connectionFactory() { return new JedisConnectionFactory(); } }
其中@EnableRedisHttpSession这个注解是中让spring开启一个拦截器Filter,来实现Session共享;其中配置的这个Bean是用来加载Properties中的redis参数,连接redis服务;
如果不使用Security,下面的几步就不用做了,这个类中配置的Bean也不用配置。
Spring Security 配置
在项目中添加该类:
[code]public class SecurityInitializer extends AbstractSecurityWebApplicationInitializer { public SecurityInitializer() { super(SecurityConfig.class, Config.class); } }
super()的第二个参数,就是我们上面的那个Config文件。添加这个配置文件后,Spring Security就会把Session放到Redis中,这样基于Spring Security的项目也可以实现Session共享了。
Initializer 配置
这一步写法异常简单,还是创建文件:
[code]public class Initializer extends AbstractHttpSessionApplicationInitializer { }
就这样,继承一个类即可。
大功告成!简单的超乎想像,这就是Spring Boot的优势所在。下面我们来自己登录一下,看看Spring Security是否把Session放到Redis中。
(登录过程我就不讲了,,在自己项目中调用一下Security的登录即可)
然后用redis-cli连接到redis,执行keys *
会看到如下:
你会发现redis里多了一堆以spring:session:***为key的东西,这样就说明Spring Security确实把Session放到了我们配置的redis中。这样就可以实现session共享了。
参考文章:https://www.geek-share.com/detail/2694598436.html
https://www.cnblogs.com/mengmeng89012/p/5519698.html
阅读更多
- 基于Spring Boot-Spring Session-Redis的分布式Session共享解决方案
- 基于Spring Boot/Spring Session/Redis的分布式Session共享解决方案
- Spring整合Spring Session,用redis解决分布式session共享问题
- Spring Boot(十一)Redis集成从Docker安装到分布式Session共享
- 使用Spring boot基于Redis快速搭建分布式Session缓存方案
- 详解springboot中redis的使用和分布式session共享问题
- 基于SpringBoot,SpringSession和redis的会话共享
- spring boot整合redis实现shiro的分布式session共享的方法
- 基于Spring session 和 redis 的session共享问题
- 使用springboot+redis实现session共享
- spring boot + redis 实现session共享
- 基于springboot+bootstrap+mysql+redis搭建一套完整的权限架构【一】【构建工程】
- 基于springboot+redis+bootstrap+mysql开发一套属于自己的分布式springcloud云权限架构(四)【构建链路调用监控系统】
- 基于springboot+bootstrap+mysql+redis搭建一套完整的权限架构【五】【编写基础代码快速生成工具】
- Spring Boot系列(七)Spring Boot使用Redis实现session共享
- 基于SpringBoot简单实现SpringAop+Redis+cookie 单点登录 和 用户登录检测
- 使用springboot+redis实现session共享
- SpringBoot RedisTemplate乱码解决方案
- (十九)SpringBoot之使用Spring Session集群-redis
- 使用springboot+redis实现session共享