Redis Session

在Spring默认的项目中,Session数据是存放在本地,当项目重启,Session数据就会被清除。

因此,我们需要学会使用Redis来完成Session数据的缓存。

引入依赖

首先,使用Redis进行Session需要引入依赖。

我们需要先删除旧的Spring依赖项:

<dependency>
  <groupId>org.springframework.session</groupId>
  <artifactId>spring-session-core</artifactId>
</dependency>

添加相关依赖:

<!-- spring session 支持 -->
<dependency>
  <groupId>org.springframework.session</groupId>
  <artifactId>spring-session-data-redis</artifactId>
</dependency>
<dependency>
  <groupId>org.redisson</groupId>
  <artifactId>redisson-spring-boot-starter</artifactId>
  <version>3.13.0</version>
</dependency>
  • spring-session-data-redis 是核心依赖库,会自动完成 Session 同步到 Redis 等操作
  • redisson-spring-boot-starter 是需要用到的 Redis 客户端,提供很多分布式相关操作服务,操作 Session 数据的过程中,与核心依赖库搭配使用。

当然,Redis依赖也需要引入。

Session配置类

在我们使用Spring原生进行Session配置时,需要创建并配置Session配置类:

@Configuration
@EnableSpringHttpSession
public class SpringHttpSessionConfig {
    @Bean
    public CookieSerializer cookieSerializer() {
       DefaultCookieSerializer serializer = new DefaultCookieSerializer();
       serializer.setCookieName("JSESSIONID");
       // 用正则表达式配置匹配的域名,可以兼容 localhost、127.0.0.1 等各种场景
       serializer.setDomainNamePattern("^.+?\\.(\\w+\\.[a-z]+)$");
       serializer.setCookiePath("/");
       serializer.setUseHttpOnlyCookie(false);
       // 最大生命周期的单位是秒
       serializer.setCookieMaxAge(24 * 60 * 60);
       return serializer;
    }

    @Bean
    public MapSessionRepository sessionRepository() {
        return new MapSessionRepository(new ConcurrentHashMap<>());
    }
}

使用了@EnableSpringHttpSession完成配置

数据仓库:其中因为系统未提供默认的存储Session数据的仓库,所以需要在sessionRepository() 方法中 new 一个仓库对象(Session存储于本地服务器),数据存储与线程安全的、支持高效并发的 ConcurrentHashMap

cookieSerializer()方法是用来定制Cookie中的Session信息内容如何写。

使用Redis储存Session方案。

使用redis储存Session核心是修改注解@EnableSpringHttpSession ,改为使用 @EnableRedisHttpSession

因为Redis本身就是仓库,所以不需要再另外建仓库,sessionRepository()也就不需要了。

@EnableRedisHttpSession 时,可以通过 maxInactiveIntervalInSeconds注解参数来设置Session数据过期失效的时间,单位是秒。

@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 300)

如果不设置,默认是1800秒。