spring-session整合redis原理 排查失效原因

2023-10-26

根据网上配置了一个springsession整合redis作为session后,发现session获取失败,redis里面是有值。登录模块设置进去也能获取的到,但是其他的服务就获取不到。记录一下,跟着源码探寻为何失败
auth服务的配置

  1. 引入依赖
        <dependency>
            <groupId>org.springframework.session</groupId>
            <artifactId>spring-session-data-redis</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>io.lettuce</groupId>
                    <artifactId>lettuce-core</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
        </dependency>
  1. 编写配置
spring:
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.0.94:8848
  application:
    name: eshop-auth
  thymeleaf:
    cache: false
  session:
    store-type: redis
  redis:
    host: 192.168.0.94
  1. 使用注解 @EnableRedisHttpSession
  2. 扩大cookie的域名
@Configuration
public class SessionConfig {
    @Bean
    public CookieSerializer cookieSerializer(){
        DefaultCookieSerializer cookieSerializer = new DefaultCookieSerializer();
        cookieSerializer.setDomainName("gulimall.com");
        return cookieSerializer;
    }
}
  1. 登录成功后设置session
    @PostMapping("/login")
    public String login(UserLoginVo loginVo, HttpSession session) {
        session.setAttribute("user","123");
        return "redirect:http://gulimall.com";
    }

其他模块
在这里插入图片描述

探寻原理

  1. @EnableRedisHttpSession 注解下手,可以看到它引入了另一个配置 RedissonHttpSessionConfiguration
    在这里插入图片描述

  2. RedissonHttpSessionConfiguration 又引入了一个 RedissonSessionRepository在这里插入图片描述

  3. 并且 RedissonHttpSessionConfiguration 继承于 SpringHttpSessionConfiguration,这个类创建了一个filter
    在这里插入图片描述

  4. 首先来分析 RedissonSessionRepository
    就是封装了一些对session的增删改查的操作
    在这里插入图片描述

  5. 再来看filter, 首先从刚才创建的 RedissonSessionRepository中获取放到内部
    在这里插入图片描述

  6. 其中有一个方法
    在这里插入图片描述

  7. 这个方法属于他的父类的抽象方法 OncePerRequestFilter
    在这里插入图片描述

  8. dofilterinternal 方法内部把 request 和response 都包装了一遍传递给下一层
    在这里插入图片描述

  9. 这时候我们来看 springmvc 的 session 是怎么获得的。 直接用 session 和 request的 getsession是同样一个东西
    在这里插入图片描述

  10. 所以我们来看看包装的request里面的getsession是怎么实现的
    在这里插入图片描述

  11. 由于我这次的问题是登录的session在主页找不到,所以一定是要有session 的,问题就出在 getRequestedSession 方法中
    这个sessionRepository 就是一开始注解中引入的类
    在这里插入图片描述

  12. RedisSessionRepository 中对于session的操作
    在这里插入图片描述

至此我在跟踪源码的过程中发现,在获取
S session = SessionRepositoryFilter.this.sessionRepository.findById(sessionId);
这个方法中返回的数据是null
仔细排查发现实现类变成了RedissonSessionRepository

因为这个模块中有使用redisson作为分布式锁,所以在使用注解的时候 @EnableRedisHttpSession 自动提示成了 @EnableRedissonHttpSession 导致出现的bug。如果看不懂源码,这个问题可能需要非常久的时间才能排查出来.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

spring-session整合redis原理 排查失效原因 的相关文章

随机推荐

  • RK3588开发板上使用Qt+OpenCV捕获摄像头图像

    在Qt下没有专门的视频采集与播放工具 这里使用了OpenCV所带的库函数捕获摄像头的视频图像 硬件环境 讯为RK3588开发板 OV5695 MIPI接口 摄像头 软件版本 OS ubuntu20 04镜像固件 QT 5 12 8 Qt C
  • 安全运营场景下的语言模型应用

    接上篇 将安全运营的定义为 使用算法能力提取关键信息 以此来规避算法误判漏判带来的责任问题 同时提升运营人员的工作效率 在这篇尝试对语言模型的使用方法做一下讨论和分享 1 语言模型 先聊一下语言模型 这里刻意规避了 大模型 这个词 主要是对
  • 【Python】循环语句

    目录 1 while 循环 2 for 循环 3 continue 4 break 1 while 循环 基本语法格式 while 条件 循环体 条件为真 则执行循环体代码 条件为假 则结束循环 例1 打印 1 10 的整数 num 1 w
  • pyspark合并两个dataframe_PySpark源码解析,教你用Python调用高效Scala接口

    在数据科学领域 Python 一直占据比较重要的地位 仍然有大量的数据工程师在使用各类 Python 数据处理和科学计算的库 例如 numpy Pandas scikit learn 等 相较于Scala语言而言 Python具有其独有的优
  • Mybatis 快速入门之mybatis与spring集成

    目录 一 基本概念撰述 1 SqlSessionFactory对象 只有创建了SqlSessionFactory对象 才能调用openSession 方法得到SqlSession对象 2 dao接口的代理对象 例如StudentDao接口
  • Hadoop Ls命令添加显示条数限制參数

    前言 在hadoop的FsShell命令中 预计非常多人比較经常使用的就是hadoop fs ls lsr cat等等这种与Linux系统中差点儿一致的文件系统相关的命令 可是细致想想 这里还是有一些些的不同的 首先 从规模的本身来看 单机
  • adfs服务器获取信息失败,为什么 elasticsearch 获取节点信息失败?

    在 spring boot 项目中即成集成 elasticsearch dao层数据与es交互使用的的是 spring data elasticsearch 首先安装了服务器端的 es 服务 和 head 插件 es 服务启动正常 node
  • C++中关于count的用法总结

    华为OD机试真题 2022 2023 真题目录 点这里 华为OD机试真题 信号发射和接收 试读 点这里 华为OD机试真题 租车骑绿道 试读 点这里 C 中关于count的用法总结 下面是关于字符串中count的两种用法 STL容器 数组的用
  • JS逆向笔记之断点分类

    JS逆向笔记之断点分类 文章目录 JS逆向笔记之断点分类 1 JS断点 2 DOM断点 3 XHR断点 4 事件监听器断点 1 JS断点 1 Sources断点 Sources断点添加的流程是 F12 Ctrl Shift I 打开开发工具
  • Python-opencv读取深度图像

    由于实验需要用到Kinect2 0采集的深度图像 但是用以下程序读取深度图片的时候显不方便观察 temp img cup depth png depth filename os path join image dir depth img t
  • Error during job, obtaining debugging information... FAILED: Execution Error, return code 2 from org

    create table userbehavior partitioned2 user id string item id string category id string behavior type string partitioned
  • 【亚稳态、建立时间和保持时间】亚稳态的产生原因、危害及解决方法

    一 亚稳态的产生原因 如图所示 当 sys clk 时钟信号上升沿踩到 Rx 信号的变化间隙时 此时输出的 Rx reg1 信号就会出现亚稳态 其输出信号就会出现震荡 毛刺或者固定在某一电压值 而不是等于 D 端输入的值 经过震荡之后 Q
  • 模拟电路设计(4)--- J-FET的结构和工作原理

    场效应管和BJT在工作过程中有很大区别 BJT的电荷载体是空穴或是被击出的少量 少子 而场效应管的电荷则是多几个数量级的自由电子 多子 J FET晶体管 N沟道J FET晶体管结构示意图 以N沟道J FET来说明 结合J FET的电路符号示
  • OA项目之左侧菜单&动态选项卡

    目录 1 左侧导航 参考地址 http layui org cn doc element nav html 2 导入数据表及无限级分类 1 数据导入 此步骤在第一次文章已完成 2 无限级分类 父亲找儿子的过程 将对应的儿子放在父亲下面 形成
  • 从目标检测数据集中扣出所需类别进行分类

    文章目录 1 获取VOC数据集中两轮车 2 接着做COCO数据集的分类数据获取 3 YOLO 格式数据 4 openimage数据获取 获取标签 根据displayname 获取 labelname 并指定我们想要的类别 根据标签名找到对应
  • Java多线程编程

    1 Java多线程推荐两本比较好的书 Java多线程编程实战指南 核心篇 pdf 2017年出版 内容新 讲解清晰 首推这本 然后是 Java多线程编程核心技术 2015年出版 由浅入深 编程例子多 也不错 本博客只做易忘拾遗 2 this
  • 【100%通过率 】【华为OD机试 c++/java/python】任务总执行时长【 2023 Q1

    华为OD机试 题目列表 2023Q1 点这里 2023华为OD机试 刷题指南 点这里 题目描述 任务总执行时长 任务编排服务负责对任务进行组合调度 参与编排的任务有两种类型 其中一种执行时长为taskA 另一种执行时长为taskB 任务一旦
  • 麒麟 mips mysql_中标麒麟(龙芯CPU)--docker基础镜像制作

    Docker 是一个开源的应用容器引擎 基于 Go 语言 并遵从Apache2 0协议开源 Docker 的出现为开发人员和运维人员带来了极大的便利 Docker在X86下常见的发行版Linux如Ubuntu Centos上应用非常成熟 教
  • 数据结构---插入排序

    插入排序 算法思想 具体流程 JAVA实现 算法时间复杂度为O n2 的排序 冒泡排序 弊端 元素交换次数太多了 选择排序 弊端 当数列包含多个值相等的元素时 选择排序有可能打乱它们原有的顺序 插入排序 算法思想 维护一个有序区 把元素一个
  • spring-session整合redis原理 排查失效原因

    根据网上配置了一个springsession整合redis作为session后 发现session获取失败 redis里面是有值 登录模块设置进去也能获取的到 但是其他的服务就获取不到 记录一下 跟着源码探寻为何失败 auth服务的配置 引