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

springbot,JWT令牌的使用。实现http请求拦截校验。

 

JWT 由三部分组成,用点(.)分隔 Header(头部) Payload(负载)Signature(签名)

 一、原理

Jwt原理其实很简单,在后端首先要有个拦截器,他会拦截所有http请求,意思就是所有访问都被拦截掉,当然这是不合理的。所以首先我们要手动放行登陆页面,也就是登录请求不拦截可以访问,然后自此以后的所有请求都会被拦截。如何不让他拦截呢?这时候就要设置一些规则来放行请求,那么这个规则就是Jwt令牌的用处。他会生成一个token在前后端传来传去,怎么传呢?前端的http请求都有一个header,token就会被携带在里面,后端解析http请求,拿到token来验证。如果通过则放行,不通过就拦截。注意(token在实体类中有字段,但是数据库中不必有专门的列来保存token)

  @TableField(exist = false)private String token;

二、第一次请求生成token,不验证token

1.首先,当用户成功登陆时,会请求/login

 @PostMapping("/login")public Result login(@RequestBody User user) {if(StrUtil.isBlank(user.getUsername()) || StrUtil.isBlank(user.getPassword())) {return Result.error("帐号或密码不能为空");}user  = userService.loginUser(user);return Result.success(user);}

2.访问user的服务层的loginUSer,先通过user参数,查询对应的user给dbuser,判断是否存在,和user参数的密码和查到的密码是否相同。都满足则创建token,把token通过set方法给dbuser,返回给前端

 @Overridepublic User loginUser(User user) {User dbuser =  userMapper.selectByUsername(user.getUsername());if(dbuser == null){throw new ServiceException("用户名或密码错误");}if(!user.getPassword().equals(dbuser.getPassword())){throw new ServiceException("用户名或密码错误");}String token = TokenUtils.createToken(dbuser.getId().toString(), dbuser.getPassword());dbuser.setToken(token);return dbuser;}

这里面用到了TokenUtils的createToken方法,就是生成token的地方

@Component // 标记此类为Spring组件,使其可以被Spring管理
public class TokenUtils {// 声明一个静态的UserMapper,用于在静态方法中访问用户数据private static UserMapper staticUserMapper;// 注入UserMapper实例@ResourceUserMapper userMapper;// 在类实例化后,设置静态的UserMapper@PostConstruct // 标记此方法在构造函数后自动执行public void setUserService() {staticUserMapper = userMapper; // 将实例UserMapper赋值给静态变量}/*** 生成token** @param userId 用户ID* @param sign   用于签名的密钥* @return 生成的token字符串*/public static String createToken(String userId, String sign) {// 创建JWT并设置载荷return JWT.create().withAudience(userId) // 将用户ID存储在token的载荷中.withExpiresAt(DateUtil.offsetHour(new Date(), 2)) // 设置token有效期为2小时.sign(Algorithm.HMAC256(sign)); // 使用指定的密钥签名token}}

三、随后的请求都要验证token

上面我们已经说到第一次请求,也就是登录时会生成token,返回给前端。前端会保存在浏览器中,以后每次header里面都会携带这个token,那么现在就开始第二次请求。

1.验证token过程

因为拦截器的作用,发过来的http请求会被拦截,以验证规则。

当前端请求发送到后端会首先进到这里验证token,而不是直接访问@GetMapping("*请求的接口*")

首先,会从请求头拿token,如果没有则拦截,否则 验证token是否为空,如果为空拦截,

不为空后,解析token中user的id,然后查询数据库是否有这个user,否则拦截,当查到后,

使用用户密码生成一个验证器(为什么是密码呢?因为上面我们生成token时就是用密码作为密钥),与传过来的token进行验证,如果通过则,验证成功,不拦截请求,访问@GetMapping("*请求的接口*")

/*** 功能:JWT 拦截器,用于对请求进行身份验证* 作者:lhp* 日期:2024/9/26 23:01*/
public class JwtInterceptor implements HandlerInterceptor {@Resourceprivate UserMapper userMapper; // 自动注入 UserMapper,用于数据库操作@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {// 从请求头中获取 tokenString token = request.getHeader("token");// 如果请求头中没有 token,则尝试从请求参数中获取if (StrUtil.isBlank(token)) {token = request.getParameter("token");}// 执行认证,首先检查 token 是否为空if (StrUtil.isBlank(token)) {// 如果 token 为空,抛出未授权异常throw new ServiceException("401", "请登录");}// 获取 token 中的用户 IDString userId;try {userId = JWT.decode(token).getAudience().get(0); // 解码 token,获取用户 ID} catch (JWTDecodeException j) {// 解码失败,抛出未授权异常throw new ServiceException("401", "请登录");}// 根据 token 中的 userId 查询数据库,获取用户信息User user = userMapper.selectById(Integer.valueOf(userId));if (user == null) {// 如果用户不存在,抛出未授权异常throw new ServiceException("401", "请登录");}// 使用用户密码生成 JWTVerifier,用于验证 tokenJWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256(user.getPassword())).build();try {// 验证 token 的有效性jwtVerifier.verify(token);} catch (JWTVerificationException e) {// 验证失败,抛出未授权异常throw new ServiceException("401", "请登录");}// 所有验证通过,返回 true,表示请求可以继续return true;}
}

 至此就是Jwt的整个流程。以下是拦截器的代码,这个配置类的主要功能是设置一个 JWT 拦截器,用于拦截所有的 HTTP 请求,以便于进行身份验证,但对 /login 请求路径不进行拦截

/*** 功能:拦截器配置类,用于配置和注册自定义的拦截器* 作者:lhp* 日期:2024/9/26 23:15*/
@Configuration // 标记该类为配置类,Spring 会在运行时自动识别并加载该类的 Bean 定义
public class InterceptorConfig extends WebMvcConfigurationSupport {/*** 重写 addInterceptors 方法,用于添加自定义拦截器* * @param registry 拦截器注册中心,用于注册自定义拦截器*/@Overrideprotected void addInterceptors(InterceptorRegistry registry) {// 注册 JwtInterceptor 拦截器registry.addInterceptor(jwtInterceptor()).addPathPatterns("/**") // 拦截所有请求路径.excludePathPatterns("/login"); // 排除登录路径,不拦截登录请求// 调用父类的 addInterceptors 方法,确保其他配置能够正常工作super.addInterceptors(registry);}/*** 定义 JwtInterceptor Bean,Spring 会自动管理该 Bean 的生命周期* * @return JwtInterceptor 实例*/@Beanpublic JwtInterceptor jwtInterceptor() {return new JwtInterceptor(); // 创建并返回 JwtInterceptor 的新实例}
}

 

 

 

相关文章:

springbot,JWT令牌的使用。实现http请求拦截校验。

JWT 由三部分组成,用点(.)分隔 Header(头部) Payload(负载)Signature(签名) 一、原理 Jwt原理其实很简单,在后端首先要有个拦截器,他会拦截所有http请求&…...

【SQL】DDL语句

文章目录 1.SQL通用语法2.SQL的分类3.DDL3.1数据库操作3.2 表操作3.2.1 表操作--数据类型3.2.2 表操作--修改3.2.3 表操作--删除 SQL 全称 Structured Query Language,结构化查询语言。操作关系型数据库的编程语言,定义了一套操作关系型数据库统一标准 。…...

【分页】Spring Boot 列表分页 + javaScript前台展示

后端: 准备好查询实体与分页实体 1、分页工具实体 package com.ruoyi.dms.config;import com.alibaba.nacos.api.model.v2.Result; import lombok.Data;import java.io.Serializable; import java.util.List;/*** author 宁兴星* description: 列表返回结果集*/ …...

「安装」 Windows下安装CUDA和Pytorch

「安装」 Windows下安装CUDA和Pytorch 文章目录 「安装」 Windows下安装CUDA和PytorchMac、Linux、云端Windows安装CUDA安装miniconda安装PyTorch测试总结 其他 Mac、Linux、云端 Mac、Linux、云端安装Miniconda和Pytorch的方法参考其他资料。 Windows 下面进行Windows下安装…...

c语言基础作业

选择题 1.1、以下选项中,不能作为合法常量的是 __________ A)1.234e04 B)1.234e0.4C)1.234e4 D)1.234e0 1.2、以下定义变量并初始化错误的是_____________。 A) char c1 ‘H’ ; B) char c1 9…...

uniapp view增加删除线

推荐学习文档 golang应用级os框架,欢迎stargolang应用级os框架使用案例,欢迎star案例:基于golang开发的一款超有个性的旅游计划app经历golang实战大纲golang优秀开发常用开源库汇总想学习更多golang知识,这里有免费的golang学习笔…...

[Day 83] 區塊鏈與人工智能的聯動應用:理論、技術與實踐

區塊鏈在物聯網中的應用 區塊鏈技術與物聯網(IoT)結合,為許多領域提供了強大的解決方案。傳統的IoT架構常面臨數據隱私和安全問題,而區塊鏈的去中心化和加密技術則能有效增強IoT系統的安全性、透明性和效率。本文將探討區塊鏈如何…...

Java ReentrantLock

目录 1 互斥性 2 公平性 3 可重入性 4 获取和释放锁 5 尝试获取锁 6 可中断的锁定 7 条件变量 8 性能 9 使用场景 ReentrantLock 是 Java 提供的一种可重入的互斥锁,位于 java.util.concurrent.locks 包中,它实现了 Lock 接口。这个锁提供了与内…...

【Linux系统编程】第二十六弹---彻底掌握文件I/O:C/C++文件接口与Linux系统调用实践

✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】 目录 1、回顾C语言文件接口 1.1、以写的方式打开文件 1.2、以追加的方式打开文件 2、初步理解文件 2.1、C文件接口 3、进一步理…...

数据分析-29-基于pandas的窗口操作和对JSON格式数据的处理

文章目录 1 窗口操作1.1 滑动窗口思想1.2 函数df.rolling2 JSON格式数据2.1 处理简单JSON对象和JSON列表2.1.1 处理简单的JSON结构2.1.2 处理空字段2.1.3 获取部分字段2.2 处理多级json2.2.1 展开所有级别(默认)2.2.2 自定义展开层级2.3 处理嵌套列表JSON3 参考附录1 窗口操作 …...

Ubuntu-WSL2一键设置代理操作

现状: Window11中拥有自己的代理软件 ,可以科学上网已在WSL2中安装Ubuntu22.04 需求: Ubuntu-WSL2实现科学上网 实现: 参考:为 WSL2 一键设置代理 Linux 子系统中的网关指向的是 Windows,DNS 服务器指…...

ubuntu命令行连接wifi

在Ubuntu上,你可以通过命令行连接到Wi-Fi网络。以下是详细步骤,主要使用 nmcli 和 nmtui 命令。 方法 1:使用 nmcli nmcli 是 NetworkManager 的命令行界面,用于管理网络连接。以下是使用 nmcli 连接到 Wi-Fi 网络的步骤&#x…...

日常工作第10天:

vim 批量编辑的命令是 移动光标到列首。按键 CtrlV 进入 Visual block 模式,标记你想要进行编辑的列(HJKL可以向左下上右移动光标)。按键 ShiftI 进入 Insert 模式,在列首输入文本;或者 Shift A,追加文本…...

CNN+Transformer解说

CNN(卷积神经网络)和Transformer是两种在深度学习领域广泛使用的模型架构,它们在处理不同类型的数据和任务时各有优势。 CNN擅长捕捉局部特征和空间层次结构,而Transformer擅长处理序列数据和长距离依赖关系。 将CNN与Transform…...

jmeter中token测试

案例: 网站:http://shop.duoceshi.com 讲解:用三个接口来讲解 第一个接口code:GET http://manage.duoceshi.com/auth/code 第二个登录接口:http://manage.duoceshi.com/auth/login 第三个接口:http://…...

基于解压缩模块的JPEG同步重压缩检测论文学习

一、论文基本信息: 论文题目:基于解压缩模块的JPEG同步重压缩检测 作者:王金伟1 ,胡冰涛1 ,张家伟1 ,马 宾2 ,罗向阳3 (1.南京信息工程大学计算机学院、网络空间安全学院&#xf…...

音视频入门基础:FLV专题(7)——Tag header简介

一、引言 从《音视频入门基础:FLV专题(3)——FLV header简介》中可以知道, 在FLV header之后,FLV文件剩下的部分应由PreviousTagSize和Tag组成。FLV文件 FLV header PreviousTagSize0 Tag1 PreviousTagSize1 Ta…...

【Linux 报错】“make: ‘xxxx‘ is up to date.” 解决办法

一、报错原因 我们使用 make 命令,想要将 text.c 文件编译形成 可执行文件 text 时,报错如下 make: test is up to date. 中文含义:test 文件已经达到最新状态 意思是: test.c 文件里面的 所有源代码都没有修改过,你…...

【FPGA开发】Xilinx FPGA差分输入时钟的使用方法

正文 以前在使用ZYNQ的领航者ZYNQ7020进行FPGA学习时,它们使用的单端50M的输入时钟,在verlog代码编写上比较简单,而现在使用Alinx的AXU3EG开发板时,发现它使用的是200M的差分输入时钟,哪这个时候,输入时钟要…...

面试扩展知识点

1.C语言中分为下面几个存储区 栈(stack): 由编译器自动分配释放堆(heap): 一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收全局区(静态区): 全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域&#…...

谷歌浏览器插件

项目中有时候会用到插件 sync-cookie-extension1.0.0:开发环境同步测试 cookie 至 localhost,便于本地请求服务携带 cookie 参考地址:https://juejin.cn/post/7139354571712757767 里面有源码下载下来,加在到扩展即可使用FeHelp…...

Neo4j 集群管理:原理、技术与最佳实践深度解析

Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...

JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作

一、上下文切换 即使单核CPU也可以进行多线程执行代码,CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短,所以CPU会不断地切换线程执行,从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...

莫兰迪高级灰总结计划简约商务通用PPT模版

莫兰迪高级灰总结计划简约商务通用PPT模版,莫兰迪调色板清新简约工作汇报PPT模版,莫兰迪时尚风极简设计PPT模版,大学生毕业论文答辩PPT模版,莫兰迪配色总结计划简约商务通用PPT模版,莫兰迪商务汇报PPT模版,…...

苹果AI眼镜:从“工具”到“社交姿态”的范式革命——重新定义AI交互入口的未来机会

在2025年的AI硬件浪潮中,苹果AI眼镜(Apple Glasses)正在引发一场关于“人机交互形态”的深度思考。它并非简单地替代AirPods或Apple Watch,而是开辟了一个全新的、日常可接受的AI入口。其核心价值不在于功能的堆叠,而在于如何通过形态设计打破社交壁垒,成为用户“全天佩戴…...

LOOI机器人的技术实现解析:从手势识别到边缘检测

LOOI机器人作为一款创新的AI硬件产品,通过将智能手机转变为具有情感交互能力的桌面机器人,展示了前沿AI技术与传统硬件设计的完美结合。作为AI与玩具领域的专家,我将全面解析LOOI的技术实现架构,特别是其手势识别、物体识别和环境…...

五子棋测试用例

一.项目背景 1.1 项目简介 传统棋类文化的推广 五子棋是一种古老的棋类游戏,有着深厚的文化底蕴。通过将五子棋制作成网页游戏,可以让更多的人了解和接触到这一传统棋类文化。无论是国内还是国外的玩家,都可以通过网页五子棋感受到东方棋类…...

C++--string的模拟实现

一,引言 string的模拟实现是只对string对象中给的主要功能经行模拟实现,其目的是加强对string的底层了解,以便于在以后的学习或者工作中更加熟练的使用string。本文中的代码仅供参考并不唯一。 二,默认成员函数 string主要有三个成员变量,…...

RLHF vs RLVR:对齐学习中的两种强化方式详解

在语言模型对齐(alignment)中,强化学习(RL)是一种重要的策略。而其中两种典型形式——RLHF(Reinforcement Learning with Human Feedback) 与 RLVR(Reinforcement Learning with Ver…...

用 FFmpeg 实现 RTMP 推流直播

RTMP(Real-Time Messaging Protocol) 是直播行业中常用的传输协议。 一般来说,直播服务商会给你: ✅ 一个 RTMP 推流地址(你推视频上去) ✅ 一个 HLS 或 FLV 拉流地址(观众观看用)…...