分布式会话
文章目录
本文作为 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; } }