SpringBoot整合Spring Session Redis

一、问题由来

  • 项目使用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版权协议,转载请附上原文出处链接和本声明。