redis session时,sessionId作为token,可靠实现

2023-05-16

场景:

在一些不能使用session,或者session不能保持的情况,通常服务器端产生一个token字符串标识用户登录状态。当前端调用后端接口时,将此token作为参数加入到请求中,这样能够避免依赖浏览器与服务端会话状态。token身份验证可用于多域名间保持用户状态,后端负载均衡非ip hash策略等情况。

实现过程:

  1. pom中增加redis和session依赖
        <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>
复制代码
  1. 在登陆过程中将用户信息和其他需要的信息放入session
	HttpSession httpSession = request.getSession();
	httpSession.setAttribute("user", user);
复制代码
  1. 把sessionId返回给前端
    String sessionId = httpSession.getId();
    JSONObject result = new JSONObject();
    result.put("sessionId", sessionId);
复制代码

这样的流程就是经常使用session的方式。

token(sessionId)使用过程(重点)

重点是从session中获取user的过程,在接收到前端请求时,常见获取user的实现代码:

User user = (User) httpSession.getAttribute("user");
复制代码

但是这样就没有token什么事了,并没有是使用token来做验证。如果要想使用token(sessionId)获取到user,第一个想法就是直接从使用redisTemplate的hash操作,根据key获取到里面的内容,查看一下redis存储session的key,如图:

这里获取还要注意序列化的问题,只有使用相同方式序列化key后才能获取到值。

这种方式想想就很复杂,难道没有简洁的方式获取到这些值吗,存进去的时候挺简单,拿出来时候不能这么麻烦吧。本着对spring强大的信心,寻找到了一个bean: RedisOperationsSessionRepository redisOperationsSessionRepository; 看到这个类的名字就很亲切,猜想一定它一定能够解决问题。通过自动注入,然后调用方法,得出以下代码:

Session session=redisOperationsSessionRepository.findById(sessionId);
if(session==null){
throw new ForbidException("请重新登录");
}
user=session.getAttribute("user");
if(user==null){
redisOperationsSessionRepository.deleteById(sessionId);
}
复制代码

注意这里的session是org.springframework.session.Session,而不是javax.servlet.http.HttpSession(常用的那个session),但是两者有着密切关系,通过适配器模式,将javax.servlet.http.HttpSession转为org.springframework.session.Session。

这样就能很方便的通过这个token(sessionId)获取到存储在redis的session的信息。

这里显然RedisOperationsSessionRepository是解决的关键点,至于是如何找到它,有两种方法:

  • 第一种,看spring-session-data-redis和spring-session-core源码,找到关键点,这种方法估计会多花3个小时的时间;
  • 第二种,最简单直接,而且在找到之后再看源码会更清晰,如果感兴趣的话,评论超过5人,我更新文档进行说明,嘎嘎,大神请飘过,或指教。

欢迎交流,不足之处请大家指正。

欢迎访问我的blog championjing.github.io/

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

redis session时,sessionId作为token,可靠实现 的相关文章

随机推荐

  • Webpack基本架构浅析

    文章webpack版本为3 6 0 前言 随着掌握的前端基础知识越来越多 xff0c 对技术的要求逐渐不满足于实现即可 xff0c 技术到了瓶颈期 xff0c 自己也曾尝试写过一些开源库 xff0c 不过很少有满意的作品 xff0c 通常没
  • Open***在linux上的完美实现

    Open 在linux上的完美实现 一 Open 的工作原理 技术通过密钥交换 封装 认证 加密手段在公共网络上建立起私密的隧道 xff0c 保障传输数据的完整性 私密性和有效性 Open 是近年来新出现的开放源码项目 xff0c 实现了
  • linux下查看uuid的三种方法及使用uuid的作用

    查看设备的uuid的三种方法 xff0c 总结如下 xff1a 1 命令查看 xff1a blkid 2 文件查看 xff1a ls l dev disk by uuid 3 命令查看 xff1a vol id dev sda1 UUID的
  • navicat 查看表的注释

    2019独角兽企业重金招聘Python工程师标准 gt gt gt navicat 不同于sqlyog 没有直接展示注释的地方 xff0c 通过查看DDL 来查看注释 查看DDL的方式 打开Navicat工具 xff0c 双击打开需要连接的
  • R语言ggplot2绘图设置X轴刻度,字体大小及绘图区大小

    gt colnames data1 seq 2 ncol data1 15 1 34 AAAA 34 34 AAGG 34 34 ATGC 34 34 ACGT 34 34 AGGA 34 34 TACG 34 34 TTCC 34 34
  • 无法连接虚拟设备sata0:1,因为主机上没有相应的设备

    打开虚拟机的时候 xff0c 弹出这个 xff0c 但是虚拟机可以正常使用 无法连接虚拟设备sata0 1 xff0c 因为主机上没有相应的设备 原因是因为开机连接CD DVD驱动器 去掉这个勾 OK 转载于 https www cnblo
  • 计算机网络第七版谢希仁知识点总结

    1 专有名词 xff1a 互联网服务提供商ISP xff08 Interest Service Provider xff09 互联网交换点 IXP xff08 Internet eXchange Point xff09 广域网WAN xff
  • SecureCRT 通过Xmanager 开启图形界面(root用户登录后,su登录oracle用户)

    一 安装了Xmanager软件 xff0c 在客户端上开启了Xmanager Passive 程序 二 SecureCRT的会话选项中 端口转发 远程 X11 里将转发X11数据包勾上 用root用户登录后运行xclock程序 xff0c
  • 多线程大串讲之二: 多线程同步的学习[1]

    一 CriticalSection 临界区 临界区 34 CriticalSection 当把一段代码放入一个临界区 线程执行到临界区时就独占了 让其他也要执行此代码的线程先等等 这和前面用的 Lock 和 UnLock 差不多 使用格式如
  • matlab练习程序(加权最小二乘)

    起本篇题目还是比较纠结的 xff0c 原因是我本意打算寻找这样一个算法 xff1a 在测量数据有比较大离群点时如何估计原始模型 上一篇曲面拟合是假设测量数据基本符合均匀分布 xff0c 没有特别大的离群点的情况下 xff0c 我们使用最小二
  • linux搜索一个文件

    find name filename 转载于 https www cnblogs com tiandsp archive 2012 07 15 2592088 html
  • VINS 回环检测与全局优化

    回环检测 VINS回环检测与全局优化都在pose graph cpp内处理 首先在pose graph node加载vocabulary文件给BriefDatabase用 xff0c 如果要加载地图 xff0c 会loadPoseGraph
  • gcc make 与cmake

    1 gcc xff08 1 xff09 是什么 xff1f 它是GNU Compiler Collection xff08 就是GNU编译器套件 xff09 xff0c 也可以简单认为是编译器 它可以编译很多种编程语言 xff08 括C C
  • server unexpectedly closed network connection

    在使用 ssh 登入 Linux 時 xff0c 卻發生了 server unexpectedly closed network connection 的狀況 解决方法 xff1a 1 修改 etc ssh sshd config 將 Us
  • 开源SDN控制器和商用SDN控制器一览

    以下是来自IT168收集的2014年可追寻到的开源SDN控制器和商用SDN控制器 xff0c 此处转载以供大家知悉 xff0c 更多控制器信息需要大家自己动手去查询和理解 开源SDN控制器组织 随机排序 xff0c 仅为了查看便利 1 组织
  • openstack 异常处理

    1 xff0c keystone 验证失败 xff0c 例如 xff1a Authorization failed The request you have made requires authentication from 172 16
  • [原]C++头文件的包含顺序研究

    作者 xff1a 朱金灿 来源 xff1a http blog csdn net clever101 一 xff0e Google C 43 43 编程风格指南 里的观点 公司在推行编码规范 xff0c 领导提议基本上使用 Google C
  • 使用badblocks检测坏块

    命令格式 badblocks svw b lt 区块大小 gt o lt 输出文件 gt 磁盘装置 磁盘区块数 启始区块 典型的命令如下 写测试 数据安全 sudo badblocks n b 4096 c 16 s dev sda o h
  • Soft NMS改进的非极大值抑制方法的pytorch cuda版本,可以用

    话不多说 xff0c 直接上代码 xff0c 代码是根据soft max论文提供的代码 xff0c 修改的 xff0c 原来的代码是cpu版本 xff0c 且返回的keep参数并不是原来bbox的序列参数 xff0c 所以做了部分修改 xf
  • redis session时,sessionId作为token,可靠实现

    场景 xff1a 在一些不能使用session xff0c 或者session不能保持的情况 xff0c 通常服务器端产生一个token字符串标识用户登录状态 当前端调用后端接口时 xff0c 将此token作为参数加入到请求中 xff0c