SpringBoot+Token+Redis+Lua+自动续签极简分布式锁Token登录方案

news2024/11/25 9:40:04

前言

用SpringBoot做一个项目,都要写登录注册之类的方案
使用Cookie或Session的话,它是有状态的,不符合现代的技术
使用Security或者Shiro框架实现起来比较复杂,一般项目无需用那么复杂
使用JWT它虽然是无状态的,也可以载荷用户数据,但还是有很多缺点
  • 缺点1:设置过期时间后,无法强制让它过期,在有效期内它始终可用
  • 缺点2:一次性的,如果用户数据有变,只能重新生成新的JWT
  • 缺点3:安全性,它是base64加密的,如果载荷有重要数据,可以被抓包解析

JWT不适合登录鉴权,适合应⽤场景:⼀次性验证,比如⽤户注册后发⼀封邮件让用户在有效期内激活账户

所以很多项目用的都是Redis+Token方案,简单方便问题少

流程 + lua优化

  1. 设置一个拦截器,不校验登录接口,拦截其他接口

  2. 登录接口接收前端传来的用户名密码,去数据库查询该用户名是否存在,该密码是否正确

  3. 如果正确则表示登录成功,调用生成Token方法,返回Token给前端

  4. Token使用用户id或账号+时间戳+UUID用MD5加密的一串字符串(不建议用其他数据,因为id或账号极少变更的,变更会增加复杂性)

  5. 生成后存储到Redis,把Token当作键,用户数据当作值,并设置过期时间

  6. 生成Token的方法中,还得防止重复调登录接口,不停生成不同的Token,所以先判断数据库中是否存在键,所以保存token键到redis的同时要在redis中再增加一条用户ID为键Token为值的数据,可以验证该用户是否已经生成过token,如下:
    ![在这里插入图片描述](https://img-blog.csdnimg.cn/d08b6c3c3edd4b78a0fef6869c1ed9f2.png
    在这里插入图片描述

    这个验证token的是已登录后其他请求通过拦截器中验证token的
    在这里插入图片描述
    在这里插入图片描述

  7. 先请求一次reids拿过期时间来判断,再选择生成或者延长

    关于Token续签(延长过期时间)
    假如设置Token五个小时过期需要重新登录,其他的博客可能有刷新token,这些工作需要前端去配合调用,无疑增加了前端和后端的工作量。所以考虑直接用已存在的Token延长时间,因为Token本身是md5加密的,所以安全性还是可以的

  8. 注意到没,判断和生成和续签都需要两次redis请求,一次判断时间,一次读写Token,
    这可能就会导致数据不一致问题,懂了吗?

    所以这部分操作全部交由lua处理
    在这里插入图片描述
    登录方法这个lua脚本中既判断了存在,又判断了是否需要延期,又可以只生成一个token,且只需要请求一次redis。

    接下来是校验其他接口方法,同时也做了验证和续期
    在这里插入图片描述
    这样登录和校验续期都只需要请求一次redis即可,类似分布式锁的实现了,相当于把token当作锁。

    方案只要配置WebMvcConfigurer
    在这里插入图片描述
    自定义一个拦截器,再写一个TokenUtil就好了,是不是很简单
    在这里插入图片描述

虽然方案还有一些不完美的,但是不影响性能和使用。有更好的意见大家提出~

原创不易,请勿盲目copy!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/519781.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

微信开发者之AppID和AppSecret举例子

-- 请不要为爱你的人流泪,因为爱你的人不会让你流泪! 序 今天对这2东西做个相对全面的介绍,不一定深入,但是对实际开发还是很有必要的 我们在微信开发中总是会绕不开2个单词: AppID:开发者ID,有些叫AppK…

蓝桥杯题单day2【题目】

动态规划 调手表https://www.lanqiao.cn/problems/230/learning/?page1&first_category_id1&sortstudents_count&second_category_id3&tags%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%92,%E5%9B%BD%E8%B5%9B 最优包含https://www.lanqiao.cn/problems/239/learning…

114.【Vue-细刷-05】

Vue-04 (二十八)、Vuex1.Vuex的简介(1).vuex是什么(2).什么时候使用Vuex(3).Vuex工作原理图 2.求和案列_纯Vue版本3.求和案列_Vuex(1).初始化状态(2).操作状态 4.求和案列_Vuex的getters(1).Vuex的getters类似于 Vue的computed 5.求和案列_Vuex中的mapSteat和mapGetters(1).靠自…

PY32F072 系列单片机,LQFP64, LQFP48, QFN32, LQFP32多种封装

PY32F072 系列微控制器采用高性能的 32 位 ARM Cortex-M0内核,宽电压工作范围的 MCU。嵌入高达 128Kbytes flash 和 16Kbytes SRAM 存储器,最高工作频率 72MHz。包含多种不同封装类型多款产品,LQFP64, LQFP48, QFN32, LQFP32。 PY32F072芯片…

C# 实现 Websocket通讯聊天 (管用、超好使,点个赞)

1、背景 WebSocket出现之前,Web端为了实现即时通讯,所用的技术都是Ajax轮询(polling)。轮询是在特定的的时间间隔(如每1秒),由浏览器对服务器发出HTTP request,然后由服务器返回最新的数据给客服端的浏览器…

基于RV1126平台分类模型全流程部署(附工程)

基于RV1126平台分类模型全流程部署 环境安装模型训练ONNX模型转换RKNN模型转换可执行文件上板推理 环境安装 首先要在虚拟机上安装瑞芯微Rv1126的SDK,重要的是要具有rknn_toolchain 一般在以下路径: sdk/external/rknn-toolkit 按照doc里面的步骤安装即…

多模态:MiniGPT-4

多模态:MiniGPT-4 IntroductionMethodlimitation参考 Introduction GPT-4具有很好的多模态能力,但是不开源。大模型最近发展的也十分迅速,大模型的涌现能力可以很好的迁移到各类任务,于是作者猜想这种能力可不可以应用到多模态模…

物联网常见协议之 Amqp 协议及使用场景解析

引言 本文围绕 AMQP 协议,为大家详细解析 AMQP 协议、核心技术亮点、多协议之间的对比以及使用实践,并介绍华为云 IoT 通过 Amqp 协议如何为开发者和企业提供了更加灵活和高效的通信方式,使得物联网应用得以在各个领域得到更广泛的推广和应用…

项目文档(request页面代码逻辑)

项目文档 1. 封装请求基地址 2. 添加请求拦截器并设置请求头 作用 在向服务器发送请求时,很多请求都需要在请求头中携带token,每一次去请求都写请求头很麻烦,所以我们写一个请求拦截器,统一拦截并添加一个请求头 代码部分 // 请求拦截器 req…

[架构之路-194]-《软考-系统分析师》- 软件复用技术之软件产品线

目录 1. 思想来源:产品线 1.1 硬件产品线 1.2. 产品组合 2. 软件产品线 2.1 思想来源: 2.2 为什么使用软件产品线? 2.3 软件产品线是一种软件架构 2.4 软件产品线详解 2.5 软件产品线的双生命周期的模型 2.6 软件产品线建立方式 …

Kali E:Unable to locate package错误解决

默认的新装的kali 可能都会遇到这个安装报错E: Unable to locate package httrack问题,今天我记录下彻底解决过程和效果。 Command httrack not found, but can be installed with: apt install httrack Do you want to install it? (N/y)y apt install httrack Re…

介绍动作识别数据集:“NTU RGB+D”数据集和“NTU RGB+D 120”数据集

动作识别数据集:“NTU RGBD”数据集和“NTU RGBD 120”数据集 (还包括AUTH UAV手势数据集:NTU 4级) 本页介绍两个数据集:“NTU RGBD”和“NTU RGBD 120”。 “NTU RGBD”包含60个动作类和56,880个视频样本…

傅里叶分析的历史背景

目录 1. Fourier级数(三角级数)的历史背景 2. 圆和复平面 3. Fourier的大胆猜想 1. Fourier级数(三角级数)的历史背景 自古以来,圆形一直是(现在仍然是)最简单的抽象理解形状。您只需要一个中心点和一个半径就可以了。圆上的所有点与圆心的距离都是固定…

无监督域适应 (UDA)(1)

一、定义 1、无监督域自适应 Unsupervised domain adaptation 经典机器学习假设训练集和测试集来自相同的分布。 然而,这个假设在现实世界的应用程序中可能并不总是成立,例如,数据来源不同。 这种情况下,域分布之间会存在差异…

进阶自定义类型——结构体,枚举,联合

本章重点: 1.结构体 1.1 结构体类型的声明 1.2 结构的自引用 1.3 结构体变量的定义和初始化 1.4 结构体内存对齐 1.5 结构体传参 1.6 结构体实现位段(位段的填充&可移植性) 2.枚举 2.1 枚举类型的定义 2.2 枚举的优点 2.3 枚举的使用 3.联合 3.1 联合类…

年月日计算器——操作符重载的应用(含完整代码,简洁)

前言&#xff1a;大家好&#xff0c;这里是YY&#xff1b;此篇博客主要是操作符重载的应用&#xff1b;包含【流插入&#xff0c;流提取】【>,<,>,<,】【&#xff0c;-&#xff0c;&#xff0c;-】【前置&#xff0c;后置&#xff0c;前置--&#xff0c;后置--】 P…

Goby 漏洞更新 | Weblogic Commons Collections 序列化代码执行漏洞(CVE-2015-4852)

漏洞名称&#xff1a;Weblogic Commons Collections 序列化代码执行漏洞&#xff08;CVE-2015-4852&#xff09; English Name&#xff1a;Weblogic Commons Collections serialization code execution vulnerability (CVE-2015-4852) CVSS core: 7.5 影响资产数&#xff1a…

Docker ELK 监控日志(附yml)

目录 一 安装docker-commpose 二 编写yml文件 2.1 docker配置文件 2.2 filebeat配置文件 2.3 kibana配置文件 三 运行启动 四 打开kibana 一 安装docker-commpose 可以看我之前的docker文章 二 编写yml文件 2.1 docker配置文件 使用的7.17.9版本 &#xff0c;请保…

linux 下 ps、sort、top 命令详解

1、 ps命令 作用&#xff1a;查看系统进程&#xff0c;比如正在运行的进程有哪些&#xff0c;什么时候开始运行的&#xff0c;哪个用户运行的&#xff0c;占用了多少资源。 参数&#xff1a; -e 显示所有进程 -f 显示所有字段&#xff08;UID&#xff0c;PPIP&#xff0c;C…

Redis学习——单机版安装

目录 1.解压 2.安装gcc 3.执行make命令 4.复制redis的配置文件到默认安装目录下 5.修改redis.conf文件 6.启动redis服务与客户端 7.查看redis进行是否启动 8.关闭redis服务 9.redis性能测试 注意&#xff1a;安装redis前要安装jdk。 1.解压 [rootlxm148 install]# t…