本文作为 JWT无会话 的姊妹篇,重点介绍微服务中另一种会话解决方案:分布式会话。 分布式会话底层采用Redis,使用无感,即在开发中和使用普通的HTTP Session一样,无需任何额外代码。

增加依赖

<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.session</groupId>
    <artifactId>spring-session</artifactId>
<dependency>

增加配置

application.yml
server:
  servlet:
    session: (1)
      timeout: 1800 (2)
      cookie:
        path: / (3)

spring:
  session: #SpringSession配置
    store-type: redis
    redis:
      flush-mode: immediate (4)
      namespace: limingpub:session (5)

  redis: # spring.redis配置
    host: 127.0.0.1 # Redis地址
    port: 6379 # Redis端口
    password: # Redis密码
1 注意 server.serlet 一般已存在,则在该节点下增加
2 session过期时间,单位秒
3 cookie的路径,如果是多应用共用同一个session的话,配置到这些应用的共同父目录,比如根目录 /
4 session立即写入redis
5 session在redis里的命名空间

注意事项

  1. 由于spring session底层采用redis,由于存在反序列化问题,所以尽量减少自定义对象,尽量使用基本类型,如要复杂对象可以使用Map等通用对象。参考 常见Redis序列化的坑

  2. 如果微服务中不可避免的引入对象session,为了避免系统崩溃,忽略Jdk反序列化中找不到类的错误

    @Component("springSessionDefaultRedisSerializer")
    public class CustomSessionDefaultRedisSerializer extends JdkSerializationRedisSerializer {
    
        public Object deserialize(@Nullable byte[] bytes) {
            Object deserialObj = null;
            try{
                deserialObj =  super.deserialize(bytes);
            }catch(Exception e){
                log.warn("session无法反序列化!{}", e.getMessage());
            }
            return deserialObj;
        }
    
    }