分布式Session登录态失效

开启分布式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失效,而火狐浏览器正常运行:解决方法,谷歌浏览器开一个无痕模式
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值