分布式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

posted @ 2023-04-28 15:37  DreamCatt  阅读(68)  评论(0)    收藏  举报