一、问题由来
- 项目使用Spring Security进行请求拦截和认证授权机制时,在单一服务器部署没有异常,但在使用多台服务器负载均衡后会出现已授权失效的问题,原因在于使用Spring Security认证授权的方式依赖于SessionId,而多台服务器没有共享Session,导致请求转发到其他的负载均衡服务器后认证失效。
因此,为了解决多台服务器之间的Session共享问题,将使用redis存储Session而达到Session一致性的目的。
二、框架整合
SpringBoot提供了Spring Session Redis的整合方案,@EnableRedisHttpSession注解自动完成session存储到redis的整个过程,几乎是零配置。
参考官方文档 :
https://docs.spring.io/spring-session/docs/current/reference/html5/guides/java-redis.html#httpsession-sample
1、引入pom;
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency>
<dependency> <groupId>org.springframework.session</groupId> <artifactId>spring-session-data-redis</artifactId> </dependency>
2、在application.properties中新增redis配置项;
##Redis数据库索引(默认为0)
spring.redis.database=1
spring.redis.host=127.0.0.1
spring.redis.port=6380
spring.redis.password=连接池中的最大空闲连接
spring.redis.pool.max-idle=8
连接池中的最小空闲连接
spring.redis.pool.min-idle=0
连接池最大连接数(使用负值表示没有限制)
spring.redis.pool.max-active=8
连接池最大阻塞等待时间(使用负值表示没有限制)
spring.redis.pool.max-wait=-1
连接超时时间(毫秒)
spring.redis.timeout=0
3、开启redis集群管理session注解;
import org.springframework.context.annotation.Configuration;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;
/**
* @author xiaojin_wu
* @email wuxiaojin258@126.com
* @date 2018年3月8日
* @description spring session redis注解配置
*/
@Configuration
@EnableRedisHttpSession(maxInactiveIntervalInSeconds= 10)
public class RedisSessionConfig {
}
4、Springboot启动注解;
@SpringBootApplication
@EnableWebSecurity
@EnableAutoConfiguration//启用Spring session redis
public class AppletsApplication {
public static void main(String[] args) {
SpringApplication.run(AppletsApplication.class, args);
}
}
三、总结
- 通过以上3步就完成了通过整合Spring Session Redis完成Session共享。测试可以在本地启动两个端口的服务,通过nginx配置负载均衡,可以很明显看到不同端口的服务器
获取的Session的SessionId是一致的。
但Spring Session的默认存储策略是基于Cookie的策略,因此不适用于跨域问题和部分情况下的单点登录SSO问题。
版权声明:本文为qq_21998021原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。