分布式session
在多个微服务部署的场景中,用户登录之后,从服务A生成session, 拿到sessionId,去请求服务B,服务B没有这个session, 就会出现鉴权不通过的情况。这时需要引入分布式session, 常见的是基于redis 的分布式session
需要引入一下依赖:
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
核心注解是@EnableRedisHttpSession, 该注解定义了session有效时间、命名空间、刷新模式、定时清理cron表达式、保存模式等属性
@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) @Documented @Import(RedisHttpSessionConfiguration.class) @Configuration(proxyBeanMethods = false) public @interface EnableRedisHttpSession { // 过期时间,单位秒,默认30min int maxInactiveIntervalInSeconds() default MapSession.DEFAULT_MAX_INACTIVE_INTERVAL_SECONDS; // session命名空间,一应用一个,多个应用使用同一个redis,需要保持唯一 String redisNamespace() default RedisIndexedSessionRepository.DEFAULT_NAMESPACE; // redis session刷新模式 @Deprecated RedisFlushMode redisFlushMode() default RedisFlushMode.ON_SAVE; // redis session刷新模式默认是ON_SAVE,即调用SessionRepository#save(Session)之后才会刷新redis,IMMEDIATE:任何对session的更新都会刷新到redis FlushMode flushMode() default FlushMode.ON_SAVE; // session过期定时任务的cron表达式,默认每分钟运行 String cleanupCron() default RedisHttpSessionConfiguration.DEFAULT_CLEANUP_CRON; // session的保存模式,默认ON_SET_ATTRIBUTE:只保存对session的修改 SaveMode saveMode() default SaveMode.ON_SET_ATTRIBUTE; }
使用时可以新建配置文件,写入如下的内容(假设已经配置好redis,并使用lettuce)
@Configuration @EnableRedisHttpSession(maxInactiveIntervalInSeconds = 3600, redisNamespace = "namespace") public class RedisSessionConfig { @Bean public LettuceConnectionFactory redisConnectionFactory() { return new LettuceConnectionFactory(); } }
原理见https://blog.csdn.net/shuoyueqishilove/article/details/122244995

浙公网安备 33010602011771号