详解基于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共享。
引入依赖
首先,要在maven中加入以下依赖:
<dependencies> <!-- ... --> <dependency> <groupid>org.springframework.session</groupid> <artifactid>spring-session</artifactid> <version>1.2.2.release</version> </dependency> <dependency> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-starter-redis</artifactid> </dependency> <dependency> <groupid>org.springframework.session</groupid> <artifactid>spring-session-data-redis</artifactid> <version>1.2.2.release</version> <type>pom</type> </dependency> </dependencies>
这些就是spring-session和redis相关的依赖。
配置redis
在项目目前在使用的properties文件中,加入如下配置:
spring.redis.host=localhost spring.redis.password=secret spring.redis.port=6379
host就是redis地址,password为密码,port为端口号。
spring配置
在项目的目录中,创建一个config.java文件(名称随意)
@configuration @enableredishttpsession public class config { @bean public jedisconnectionfactory connectionfactory() { return new jedisconnectionfactory(); } }
@enableredishttpsession这个注解就是最重要的东西,加了它之后,spring生产一个新的拦截器,用来实现session共享的操作,具体实现这里暂不展开。而配置的这个bean,则是让spring根据配置文件中的配置连到redis。
如果不使用security,下面的几步就不用做了,这个类中配置的bean也不用配置。
spring security 配置
在项目中添加该类:
public class securityinitializer extends abstractsecuritywebapplicationinitializer { public securityinitializer() { super(securityconfig.class, config.class); } }
super()的第二个参数,就是我们上面的那个config文件。添加这个配置文件后,spring security就会把session放到redis中,这样基于spring security的项目也可以实现session共享了。
initializer 配置
这一步写法异常简单,还是创建文件:
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共享了。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
推荐阅读
-
详解基于Spring Boot/Spring Session/Redis的分布式Session共享解决方案
-
如何使用Spring+redis实现对session的分布式管理
-
Spring整合redis(jedis)实现Session共享的过程
-
详解基于Spring Boot/Spring Session/Redis的分布式Session共享解决方案
-
Spring Boot集成Shiro并利用MongoDB做Session存储的方法详解
-
spring boot整合redis实现shiro的分布式session共享的方法
-
Spring boot集成spring session实现session共享的方法
-
Spring Boot分布式系统实践【扩展1】shiro+redis实现session共享、simplesession反序列化失败的问题定位及反思改进
-
如何利用Spring Session和redis对Session进行共享得的相关介绍
-
Spring boot + redis 实现session 共享管理