当前位置: 首页 > news >正文

Redis实现登录的优化

目录

1 前言

2 实现步骤

2.1 软件环境准备

2.1.1 Redis的安装

2.1.2 在pom.xml中添加依赖

2.1.3 在application.yml中进行相关配置

2.2 StringRedisTemplate的常用方法

2.2.1 获取operations

2.2.2 主要方法 

2.3 令牌主动失效机制

2.3.1 登录时将令牌存入Redis

2.3.2 修改密码时删除旧的令牌

2.3.3 拦截器中进行检验


1 前言

在我们使用JWT令牌进行登录验证的时候,不可避免的也会出现一些问题。比如:当用户修改密码后,旧的令牌仍然生效。因此,我们可以采用Redis进行登录的优化。

2 实现步骤

2.1 软件环境准备

2.1.1 Redis的安装

百度网盘的链接如下,解压即可使用

链接:https://pan.baidu.com/s/1nAXT6alX-pMxxSfAe6-tsw?pwd=0529 

提取码:0529

2.1.2 在pom.xml中添加依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

在添加依赖后,会自动向IOC容器中注入StringRedisTemplate对象,通过它我们可以对Redis数据库进行相关操作。

2.1.3 在application.yml中进行相关配置

#redis初始状态没密码,所以暂时不需要配置
spring:data:redis:port: 6379 #端口号host: localhost #本地database: 0 #redis有16个小库,默认0

2.2 StringRedisTemplate的常用方法

2.2.1 获取operations

@Autowired
private StringRedisTemplate stringRedisTemplate;
//其它
ValueOperations<String, String> operations = stringRedisTemplate.opsForValue();

2.2.2 主要方法 

相关方法作用参数
operations.set("xx", "xx", 1, TimeUnit.HOURS);//过期时间为1小时向Redis中插入键值均为xx的数据

1.键(String)

2.值(String)

3.过期时间数(long)

4.时间数单位(TimeUnit.xx)

注:3和4可以不要

operations.get("xx");从Redis中获取键为xx的值键(String)
operations.getOperations().delete("xx");删除Rdis键为xx的键值对键(String)

2.3 令牌主动失效机制

2.3.1 登录时将令牌存入Redis

public class UserController {@PostMapping("/login")public Result<String> login(//其它) {//其它代码//获得JWT令牌String token = JwtUtil.genToken(claims);//将JWT令牌存入RedisValueOperations<String, String> operations = stringRedisTemplate.opsForValue();//过期时间要和JWT令牌保持一致operations.set(token, token, 1, TimeUnit.HOURS);}//其它代码
}

2.3.2 修改密码时删除旧的令牌

public class UserController {//其它代码@PatchMapping("/updatePwd")//@RequestHeader(name = "Authorization") String token从请求头中获取JWT令牌public Result updatePwd(@RequestBody Map<String, String> params, @RequestHeader(name = "Authorization") String token) {//其它代码//删除Redis中旧的JWT令牌ValueOperations<String, String> operations = stringRedisTemplate.opsForValue();operations.getOperations().delete(token);}
}

2.3.3 拦截器中进行检验

public class LoginInterceptor implements HandlerInterceptor {//其它@Overridepublic boolean preHandle(//其它) {try {//其它代码//没获取到值则不放行ValueOperations<String, String> operations = stringRedisTemplate.opsForValue();if (operations.get(token) == null) {throw new RuntimeException();}//放行return true;} catch (Exception e) {//不放行return false;}}
}

相关文章:

Redis实现登录的优化

目录 1 前言 2 实现步骤 2.1 软件环境准备 2.1.1 Redis的安装 2.1.2 在pom.xml中添加依赖 2.1.3 在application.yml中进行相关配置 2.2 StringRedisTemplate的常用方法 2.2.1 获取operations 2.2.2 主要方法 2.3 令牌主动失效机制 2.3.1 登录时将令牌存入Redis 2.…...

ROS方向第二次汇报(5)

文章目录 1.本方向内学习内容&#xff1a;1.1.自定义msg&#xff1a;1.1.1.定义msg文件&#xff1a;1.1.2.编辑配置文件&#xff1a; 1.2.自定义srv&#xff1a;1.2.1.定义srv文件&#xff1a;1.2.2.编辑配置文件&#xff1a; 1.3.服务通信案例实现&#xff1a;1.3.1.服务端实现…...

C# 浅克隆与深克隆

在C#中&#xff0c;浅克隆&#xff08;Shallow Clone&#xff09;和深克隆&#xff08;Deep Clone&#xff09;是两种常见的对象克隆技术&#xff0c;用于创建对象的新副本。 它们的主要区别在于复制对象的层次和属性的处理方式。 浅克隆&#xff08;Shallow Copy&#xff09;…...

Shell 正则表达式及综合案例及文本处理工具

目录 一、常规匹配 二、常用特殊字符 三、匹配手机号 四、案例之归档文件 五、案例之定时归档文件 六、Shell文本处理工具 1. cut工具 2. awk工具 一、常规匹配 一串不包含特殊字符的正则表达式匹配它自己 例子&#xff0c;比如说想要查看密码包含root字符串的&#x…...

React | Center 组件

在 Flutter 中有 Center 组件&#xff0c;效果就是让子组件整体居中&#xff0c;挺好用。 React 中虽然没有对应的组件&#xff0c;但是可以简单封装一个&#xff1a; index.less .container {display: flex;justify-content: center;align-items: center;align-content: ce…...

头歌C++之函数强化练习题

目录 第1关:结构实现复数运算 任务描述 编程要求 第2关:求亲密对数 任务描述 编程要求 第3关:计算一年的第几天 任务描述 编程要求 第4关:正整数求和 任务描述 编程要求 第5关:Pig Latin 任务描述 编程要求 第6关:打印日历 任务描述 编程要求 第1关:结…...

淘宝扭蛋机小程序:开启你的惊喜之旅

随着移动互联网的飞速发展&#xff0c;各种小程序层出不穷&#xff0c;其中&#xff0c;淘宝扭蛋机小程序以其独特的互动性和趣味性&#xff0c;吸引了大量用户。本文将为你详细介绍这款小程序的特色功能、用户体验以及如何使用&#xff0c;助你开启一段惊喜之旅。 一、特色功…...

Jmeter 基于Docker 实现分布式测试

基于Docker 实现分布式测试 制作Jmeter基础镜像制作工作节点镜像启动工作节点启动控制节点遇到的问题 使用Docker 部署Jmeter非常方便&#xff0c;可以省略软件的安装以及配置&#xff0c;比如jdk、jmeter。需要部署多个工作节点可以节省时间。 制作Jmeter基础镜像 下载jmeter…...

Vite与Webpack打包内存溢出问题优雅处理方式

Vite与Webpack打包内存溢出问题处理 文章目录 Vite与Webpack打包内存溢出问题处理1. Vite1. 打包错误提示2. 命令行方式解决3. 配置环境变量方式解决1. 设置变量2. 配置系统的环境变量 2. Webpack1. 打包错误提示2. 命令行方式解决3. 配置环境变量方式解决1. 设置变量2. 配置系…...

sqlalchemy——@listens_for

问&#xff1a;sqlalchemy如何实现&#xff1a;表中指定数据更新时&#xff0c;其time字段自动更新&#xff1f;答&#xff1a;使用listens_for 装饰器来注册事件监听器&#xff0c;确保在项目数据更新时触发相应的处理逻辑。 示例代码如下&#xff1a; # coding: utf-8 impo…...

MySQL进阶之锁(全局锁以及备份报错解决)

锁 全局锁 全局锁就是对整个数据库实例加锁&#xff0c;加锁后整个实例就处于只读状态&#xff0c;后续的DML的写语句&#xff0c;DDL语 句&#xff0c;已经更新操作的事务提交语句都将被阻塞。 其典型的使用场景是做全库的逻辑备份&#xff0c;对所有的表进行锁定&#xff…...

C#实现windows系统重启、关机

1、C#实现windows系统重启、关机 实现原理&#xff0c;使用系统shutdown命令执行&#xff1a; 强制关机&#xff1a; shutdown -s -f -t 0 强制重启&#xff1a; shutdown -r -f -t 0 2、关于shutdown命令详解&#xff1a; C#实现控制Windows系统关机、重启和注销的方法&…...

JS中Set和Map用法详解

目录 1、Set 1.基本用法 2.Set 实例的属性和方法 3.遍历操作 2、Map 1、Set 1.基本用法 ES6 提供了新的数据结构 Set。它类似于数组&#xff0c;但是成员的值都是唯一的&#xff0c;没有重复的值。 Set本身是一个构造函数&#xff0c;用来生成 Set 数据结构。 const s …...

使用nginx对视频、音频、图片等静态资源网址,加token签权

目前很多静态资源&#xff0c;都可以无权限验证&#xff0c;进行访问或转发&#xff0c;对有价值的资源进行签权&#xff0c;限制转发无法在代码中实现拦截&#xff0c;我们可以使用nginx对视频、音频、图片等静态资源网址&#xff0c;加token签权 如&#xff1a; http://192…...

[每周一更]-(第86期):NLP-实战操作-文本分类

NLP文本分类的应用场景 医疗领域 - 病历自动摘要&#xff1a; 应用&#xff1a; 利用NLP技术从医疗文档中自动生成病历摘要&#xff0c;以帮助医生更快速地了解患者的状况。 法律领域 - 法律文件分类&#xff1a; 应用&#xff1a; 使用文本分类技术自动分类法律文件&#xf…...

【Springcloud篇】学习笔记五(十章):Gateway网关

第十章_Gateway新一代网关 1.Gateway简介 1.1官网 上一代zuul 1.X&#xff1a;https://github.com/Netflix/zuul/wiki 当前gateway&#xff1a;https://cloud.spring.io/spring-cloud-static/spring-cloud-gateway/2.2.1.RELEASE/reference/html/ 1.2是什么 SpringCloud …...

Linux开发工具

前言&#xff1a;哈喽小伙伴们&#xff0c;经过前边的学习我们已经掌握了Linux的基本指令和权限&#xff0c;相信大家学完这些之后都会对Linux有一个更加深入的认识&#xff0c;但是Linux的学习可以说是从现在才刚刚开始。 这篇文章&#xff0c;我们将讲解若干个Linux的开发工…...

C++ 动态规划 线性DP 最长共同子序列

给定两个长度分别为 N 和 M 的字符串 A 和 B &#xff0c;求既是 A 的子序列又是 B 的子序列的字符串长度最长是多少。 输入格式 第一行包含两个整数 N 和 M 。 第二行包含一个长度为 N 的字符串&#xff0c;表示字符串 A 。 第三行包含一个长度为 M 的字符串&#xff0c;表…...

【备战蓝桥杯】——循环结构终篇

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-yl4Tqejg4LkjZLAM {font-family:"trebuchet ms",verdana,arial,sans-serif;font-siz…...

为什么说Python语法简单?

Python被广泛认为是一种语法简单、易学易用的编程语言&#xff0c;这种观点有几个关键的原因&#xff1a; 1、清晰简洁的语法结构&#xff1a; Python采用了清晰而简洁的语法结构&#xff0c;使得代码易于阅读和理解。Python的语法设计强调代码的可读性&#xff0c;采用了清晰…...

在rocky linux 9.5上在线安装 docker

前面是指南&#xff0c;后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...

解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八

现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet&#xff0c;点击确认后如下提示 最终上报fail 解决方法 内核升级导致&#xff0c;需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...

376. Wiggle Subsequence

376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...

el-switch文字内置

el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...

今日科技热点速览

&#x1f525; 今日科技热点速览 &#x1f3ae; 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售&#xff0c;主打更强图形性能与沉浸式体验&#xff0c;支持多模态交互&#xff0c;受到全球玩家热捧 。 &#x1f916; 人工智能持续突破 DeepSeek-R1&…...

MySQL中【正则表达式】用法

MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现&#xff08;两者等价&#xff09;&#xff0c;用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例&#xff1a; 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...

【7色560页】职场可视化逻辑图高级数据分析PPT模版

7种色调职场工作汇报PPT&#xff0c;橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版&#xff1a;职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...

Java编程之桥接模式

定义 桥接模式&#xff08;Bridge Pattern&#xff09;属于结构型设计模式&#xff0c;它的核心意图是将抽象部分与实现部分分离&#xff0c;使它们可以独立地变化。这种模式通过组合关系来替代继承关系&#xff0c;从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...

PHP 8.5 即将发布:管道操作符、强力调试

前不久&#xff0c;PHP宣布了即将在 2025 年 11 月 20 日 正式发布的 PHP 8.5&#xff01;作为 PHP 语言的又一次重要迭代&#xff0c;PHP 8.5 承诺带来一系列旨在提升代码可读性、健壮性以及开发者效率的改进。而更令人兴奋的是&#xff0c;借助强大的本地开发环境 ServBay&am…...

Golang——7、包与接口详解

包与接口详解 1、Golang包详解1.1、Golang中包的定义和介绍1.2、Golang包管理工具go mod1.3、Golang中自定义包1.4、Golang中使用第三包1.5、init函数 2、接口详解2.1、接口的定义2.2、空接口2.3、类型断言2.4、结构体值接收者和指针接收者实现接口的区别2.5、一个结构体实现多…...