Redis在登录接口中实现token时间的自适应增长

news/2024/10/4 20:39:30/文章来源:https://blog.csdn.net/a512512a/article/details/141421262

本篇文章前置知识,jwt令牌有一定了解,对spring有一定了解,对登录接口的实现有一定了解。

Redis在登录接口中的应用

     在我们平时写登录接口的时候,大家可能都会习惯性的说上一句,很简单哇。不就是前端像后端发送一个账号密码的请求,然后后端验证请求后,返回一个jwt令牌给前端,最后给令牌设置一个3天的过期时间,这样不就写完了吗。

    但是大家可能忽略了一个我们平时很常见的问题, 就是在上述操作中,我们jwt的令牌过期时间是写死了的。想象一个场景,我们在一次oj竞赛网站中,竞赛时间要到了,我们点击提交,结果jwt的令牌时间刚好结束了,那我们不得骂死这个开发哇。

所以为了解决上述的一个问题,这里我们需要用其他组件来对返回的Token进行一个存储和叫校验,这个组件必须得满足,有存储功能,可以设置过期时间,同时因为会反复查询,所以必须要速度快。 Redis当然就是最佳人选啦。

这里讲一下大概得流程

开发思路

     我们在后端生成jwt令牌的时候,将userId作为jwt中的存储内容进行传入,生成jwt令牌,同时将userId作为key, 敏感信息作为value 传入进入Redis数据库中,同时设置过期时间,要是用户调用接口的时候在Redis中进行一个查询,看是否能通过userId也就是Redis中的key来查到相应value,要是能查到,则表示当前用户为登录状态,同时在每一次通过查询之后,对接口进行一个剩余时间(redis中ttl)的判断,要是剩余时间不长,则对Redis中的数据进行延长,以达到一个重置登录状态的效果

这里我们的开发环节就写部分伪代码。

创建生成jwt令牌的工具类

    这里就当大家对jwt有一定了解了, 因为jwt中payload 部分是可以被解码的。所以我们不能用jwt进行敏感信息的存储,但是我们可以用jwt来存储用户的身份标识。我们首先进行jwt令牌的创建其中claims就是jwt可以存储的对象,(网上可以搜到常用工具)

 /*** ⽣成令牌** @param claims 数据* @param secret 密钥* @return 令牌*/public static String createToken(Map<String, Object> claims, String secret){//点进去HS512下面的算法全是非对称加密String token =Jwts.builder().setClaims(claims).signWith(SignatureAlgorithm.HS512,secret).compact();return token;}/*** 从令牌中获取数据** @param token 令牌* @param secret 密钥* @return 数据*/public static Claims parseToken(String token, String secret) {returnJwts.parser().setSigningKey(secret).parseClaimsJws(token).getBody();}

有了创建jwt的方法  

我们假设后端已经完成了 验证用户账号密码的一个校验 

此时调用createToken方法我们就可以进行Token的创建了 这里的Login对象为存储的敏感对象,我们可以自定义里面的字段

   public String createToken(Long userId, String secret){//创建jwt令牌, 令牌中存储userIdMap<String, Object> claim = new HashMap<>();claim.put("userId", userId);String token = JwtUtils.createToken(claim, secret);//这里的Login对象为自定义对象,可以存储用户的敏感信息,比如用户身份之类的Login login = new Login();login.setSusceptible(1);//最后2个参数为自己设置这里是伪代码redisTemplate.opsForValue().set(userId, login, timeout, timeUnit);return token;}

完成上述步骤基本的开发工作其实已经完成了,此时我们每一次前端发来请求之后我们就可以进行验证啦,当时要是项目是分布式项目的话,可以在gateway网关中完成拦截,单体架构可以就使用spring自带的拦截器就好了

@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {//先获取请求参数String url = request.getRequestURI();// 跳过不需要验证的路径 登录 和 测试等等if (......) {return true;}//从http请求头中获取token 进行身份认证 这里getToken()为自定义的方法啊String token = request.getToken();//先判断是否有令牌if (StrUtil.isEmpty(token)) {throw new Exception("令牌不能为空")}//获取令牌中信息 解析     payload中信息Claims claims;claims = JwtUtils.parseToken(token, secret); //获取令牌中信息 解析     payload中信息//令牌解析失败,可能已经被篡改过了if (claims == null) {throw new Exception("令牌已过期或验证不正确!");}//解析成功之后String userId = JwtUtils.getUserKey(claims); //获取jwt中的key//redis中是否存在jwt来判断令牌是否过期boolean isLogin = redisService.hasKey(userId);//Redis中不存在前面存储的Login对象表示登录已经过期if (!isLogin) {throw new Exception("登录状态已过期");}//说明令牌正确 .......//这里可以对用户的敏感数据进行一些处理return true;}

当前前面只是完成了jwt令牌正确性和完整性的一个校验。在处理完令牌之后还有一步很重要的内容就是判断当前令牌剩余的时候,要是剩余的时间少于一个规定值,我们就对令牌进行延长,要是长期不操作,jwt令牌就会失效。

我们来完善延长方法

private boolean exTime(HttpServletRequest request,String userid){//获取TokenString token =request.getHeader(HttpConstants.AUTHENTICATION);//找一个临界值 当时间小于临界值的时候进行一个延长 这里设定剩余120分钟是进行延长Long expire = redisService.getExpire(userid, TimeUnit.MINUTES);//180为自己设定的一个时间 可以随便设置一个L行的数 要是小于这个时间就进行延长if(expire != null && expire < 180L){redisService.expire(userid, CacheConstants.REDIS_EXP, TimeUnit.MINUTES);}return true;}

经过这一系列流程,登录接口的扩展就大致开发完成啦

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

如若内容造成侵权/违法违规/事实不符,请联系编程新知网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

恶意代码分析-Lab01-01

实验一 这个实验使用Lab01-01.exe和Lab01-01.d文件,使用本章描述的工具和技术来获取关于这些文件的信息。 问题: 将文件上传至 http:/www.VirusTotal.com/进行分析并查看报告。文件匹配到了已有的反病毒软件特征吗?这些文件是什么时候编译的?这两个文件中是否存在迹象说明它…

iOS——方法交换Method Swizzing

什么是方法交换 Method Swizzing是发生在运行时的&#xff0c;主要用于在运行时将两个Method进行交换&#xff0c;我们可以将Method Swizzling代码写到任何地方&#xff0c;但是只有在这段Method Swilzzling代码执行完毕之后互换才起作用。 利用Objective-C Runtimee的动态绑定…

【Qt】qt发布Release版本,打包.exe可执行文件

前言&#xff1a;Qt编译的可执行程序&#xff0c;如果直接运行&#xff0c;会出现0xc000007b报错&#xff0c;或者“由于占不到Qt5Network.dll,无法继续执行代码。重新安装程序可能会解决此问题”的报错&#xff0c;因为缺少相关的依赖包和动态库。 1、第一步&#xff1a;找到…

IM即时通讯软件-WorkPlus私有化部署的局域网即时通讯工具

随着企业对通讯安全和数据掌控的需求不断增加&#xff0c;许多企业开始选择私有化部署的即时通讯工具&#xff0c;以在内部局域网环境中实现安全、高效的沟通与协作。IM-WorkPlus作为一款受欢迎的即时通讯软件&#xff0c;提供了私有化部署的选项&#xff0c;使企业能够在自己的…

[数据集][目标检测]轮胎检测数据集VOC+YOLO格式4629张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;4629 标注数量(xml文件个数)&#xff1a;4629 标注数量(txt文件个数)&#xff1a;4629 标注…

用Boot写mybatis的增删改查

一、总览 项目结构&#xff1a; 图一 1、JavaBean文件 2、数据库操作 3、Java测试 4、SpringBoot启动类 5、SpringBoot数据库配置 二、配置数据库 在项目资源包中新建名为application.yml的文件&#xff0c;如图一。 建好文件我们就要开始写…

网络原理之TCP协议(万字详解!!!)

目录 前言 TCP协议段格式 TCP协议相关特性 1.确认应答 2.超时重传 3.连接管理&#xff08;三次握手、四次挥手&#xff09; 三次握手&#xff08;建立TCP连接&#xff09; 四次挥手&#xff08;断开连接&#xff09; 4.滑动窗口 5.流量控制 6.拥塞控制 7.延迟应答…

【MySQL】MySQL操作介绍

MySQL操作 认识 MySQL什么是 MySQL关系型数据库的组成结构"客户端-服务器"结构 数据库的基本操作创建数据库查看数据库删除数据库使用数据库 数据类型整型浮点类型字符串类型日期类型总结 表的操作创建表查看表查看表的信息删除表 数据的基础操作插入数据指定列插入全…

外卖霸王餐对接接口为用户提供了哪些好处?

外卖霸王餐对接接口为用户提供了多种好处&#xff0c;以下是一些主要优势&#xff1a; 免费或低成本的美食体验&#xff1a;用户可以通过霸王餐活动免费或以非常低的价格尝试不同的餐厅和菜品。发现新餐厅和菜品&#xff1a;霸王餐活动可以帮助用户发现新的餐厅和他们可能感兴趣…

Hiredis的使用

Hiredis的使用 &#x1f4f8;这里安利一个github仓库介绍 图片生成 Socialify 一键生成专业 GitHub 仓库简介图 一、Hiredis的安装与使用 1、下载hiredis软件包&#xff0c; https://github.com/redis/hiredis.git 或者使用git下载到本地 git clone https://github.com/redi…

Swift知识点---RxSwift学习

1. 什么是RxSwift RxSwift是Swift函数响应式编程的一个开源库&#xff0c;由Github的ReactiveX组织开发、维护 RxSwift的目的是&#xff1a;让数据/事件流 和 异步任务能够更方便的序列化处理&#xff0c;能够使用Swift进行响应式编程 RxSwift本质上还是观察者模式&#xff…

iLogtail 开源两周年:社区使用调查报告

作者&#xff1a;玄飏 iLogtail 作为阿里云开源的可观测数据采集器&#xff0c;以其高效、灵活和可扩展的特性&#xff0c;在可观测采集、处理与分析领域受到了广泛的关注与应用。在 iLogtail 两周年之际&#xff0c;我们对 iLogtail 开源社区进行了一次使用调研&#xff0c;旨…

B: 小球反弹

目录 一&#xff1a; 二&#xff1a; 三&#xff1a; 四&#xff1a; 一&#xff1a;问题描述 有一长方形&#xff0c;长为343720 单位长度&#xff0c;宽为233333 单位长度。在其内部左上角顶点有一小球&#xff08;无视其体积&#xff09;&#xff0c;其初速度如图所示且…

为什么要使用大模型RAG一体机

使用大模型RAG&#xff08;Retrieval-Augmented Generation&#xff09;一体机&#xff0c;如AntSKPro AI 离线知识库一体机&#xff0c;有以下几个原因和优势&#xff1a; 提高效率&#xff1a;RAG模型结合了检索&#xff08;Retrieval&#xff09;和生成&#xff08;Generati…

《粮食科技与经济》是什么级别的期刊?是正规期刊吗?能评职称吗?

​问题解答 问&#xff1a;《粮食科技与经济》是不是核心期刊&#xff1f; 答&#xff1a;不是&#xff0c;是知网收录的第一批认定学术期刊。 问&#xff1a;《粮食科技与经济》级别&#xff1f; 答&#xff1a;省级。主管单位&#xff1a; 湖南省粮食和物资储备局 …

spring boot3框架@Validated失效

项目中使用的springboot3.2.1,在使用Validated校验controller里参数时始终不生效&#xff1b;在网上查了相关资料&#xff0c;添加了spring-boot-starter-validation依赖但还是不行 经过层层调试&#xff0c;终于发现问题&#xff1b; springboot3添加Validated后校验的是 ja…

向量与矩阵几何关系

目录 一、基向量二、向量与基向量三、向量张成的空间四、矩阵与线性变换五、矩阵乘法与线性变换复合 一、基向量 基向量&#xff08;basis vectors&#xff09;是构成向量空间的一组基本元素&#xff0c;它们满足以下条件&#xff1a; 线性无关&#xff1a;基中的向量之间不能…

Matter.js:Web开发者的2D物理引擎

Matter.js&#xff1a;Web开发者的2D物理引擎 前言 在现代网页开发中&#xff0c;交互性和动态效果是提升用户体验的关键因素。 Matter.js&#xff0c;一个专为网页设计的2D物理引擎&#xff0c;为开发者提供了一种简单而强大的方式&#xff0c;来实现复杂的物理交互效果。 …

【Hot100】LeetCode—215. 数组中的第K个最大元素

目录 1- 思路快速选择 2- 实现⭐215. 数组中的第K个最大元素——题解思路 3- ACM实现 原题连接&#xff1a;215. 数组中的第K个最大元素 1- 思路 快速选择 第 k 大的元素的数组下标&#xff1a; int target nums.length - k 1- 根据 partition 分割的区间来判断当前处理方式…

Mac+Pycharm配置PyQt6教程

安装包 pip install PyQt6 PyQt6-tools #查看Qt版本 pip show PyQt6 pip show pyqt6-tools 配置扩展工具 QTD(界面设计) Program&#xff1a;/Users/wan/PycharmProjects/NewDemo/venv/lib/python3.11/site-packages/qt6_applications/Qt/bin/Designer.app Working directo…