开启分布式Session
1)application.yaml添加Redis配置,并且设置Session的type为Redis
spring:
redis:
database: 1
host: 192.168.1.102
port: 6379
timeout: 5000
password: zhuai666!
session:
store-type: redis #设置Session的type为Redis
2)补充依赖:
<!-- redis -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
</dependency>
3)主类取消Redis自动配置的移除
问题:登陆失败,Session失效
在登陆后发现,只有在User模块内才能获取到用户的登录态,而其他模块从Session获取到的登录态为空
问题探究:Debug发现,不同模块的sessionID都不一样,并且HttpServletRequest的实现类已经变成了SessionRepositoryFilter$SessionRepositoryRequestWrapper
,所以Redis分布式Sessin配置地没有问题,可以确定是前端发送请求的问题
- 接下分析浏览器Network中的请求,发现两个不同模块的请求中的Cookies的Path不一样,这是因为我们划分微服务时,不同的微服务设置了不同的路径
- 也就导致了在user模块登陆后,再向question模块发送请求时,获取不到Path为
/api/question
的Cookie,就不会携带这个记录了登录态的Cookie,最后就变成了Session失效
- 解决方法也很简单,在每个业务模块都设置好Cookie的Path,而不是默认根据context-path设置Path
- 按道理来说只设置User模块即可,因为是他返回的登录态Cookie,但保险起见还是全设置了
server:
address: 0.0.0.0
port: 8102
servlet:
context-path: /api/user
# cookie 30 天过期
session:
cookie:
max-age: 2592000
path: /api #设置Path,不然会出现Cookie失效
- 改完发现谷歌浏览器还是Session失效,而火狐浏览器正常运行:解决方法,谷歌浏览器开一个无痕模式