分布式会话
文章目录
本文作为 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里的命名空间 | 
注意事项
- 
由于spring session底层采用redis,由于存在反序列化问题,所以尽量减少自定义对象,尽量使用基本类型,如要复杂对象可以使用Map等通用对象。参考 常见Redis序列化的坑。
 - 
如果微服务中不可避免的引入对象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; } }