SpringBoot整合jwt(小白入门)

本文项目所用版本为: https://blog.csdn.net/weixin_39570751/article/details/133386557

代码仓库: https://gitee.com/skyblue0678/springboot-demo

目录

什么是JWT

JWT依赖

写一个jwt工具类

测试一下jwt

优化:将过期时间配置在文件中

答疑:反正都能解析,加密有啥用?


什么是JWT

JWT(JSON Web Token)是一种用于身份验证和授权的开放标准(RFC 7519),它是一种安全的、轻量级的身份验证方式。JWT由三部分组成:头部(Header)、载荷(Payload)和签名(Signature)。

头部通常由两部分信息组成:令牌的类型(即JWT)和所使用的签名算法。载荷包含了一些声明(Claim),用于描述用户信息、权限、过期时间等。签名由头部和载荷组成,并使用密钥进行加密生成。

JWT的使用流程如下:用户使用用户名和密码进行登录,服务器验证用户信息是否正确。服务器生成一个JWT,将用户信息、权限等信息写入载荷中,并使用密钥对头部和载荷进行签名。服务器将生成的JWT返回给客户端,客户端将其存储在本地,通常是在浏览器的cookie或本地存储中。客户端在后续的请求中,将JWT作为请求头部或请求参数传递给服务器。服务器收到请求后,验证JWT的签名是否正确,如果正确则解析出用户信息、权限等信息,进行后续操作。

JWT的优点如下:

无状态:JWT是无状态的,服务器不需要保存任何会话信息,可以轻松扩展和分布式环境下使用。

安全:JWT通过密钥对头部和载荷进行签名,保证了数据的完整性和安全性。

跨域支持:JWT可以跨域使用,可以在不同的域名和服务器之间使用。

简单易用:JWT使用简单,易于实现和维护。

然而,JWT也存在一些缺点:

载荷信息不能太多:JWT的载荷信息不能太多,否则会导致JWT的长度过长,增加网络传输的负担。

安全性依赖于密钥:JWT的安全性依赖于密钥的保护,如果密钥泄露,则JWT的安全性将受到威胁。

无法撤销:一旦JWT生成后,无法撤销,除非修改密钥或者设置短期的过期时间。

JWT依赖

<dependency><groupId>com.auth0</groupId><artifactId>java-jwt</artifactId><version>3.19.0</version>
</dependency>

将这一段拷贝到pom.xml即可。

写一个jwt工具类

jwt主要就两个方面,一个生成token,一个校验和解析token。

/*** jwt工具类*/
@Component
public class JWTUtil {@ResourceUserService userService;/*** 创建jwt* @param user* @return*/public String createToken(User user){return JWT.create().withAudience(user.getId().toString()) // 设置载荷.withExpiresAt(DateUtil.offsetHour(new Date(), 24)) // 设置签名过期的时间:24小时后.sign(Algorithm.HMAC256(user.getPwd())); // 签名 Signature}/*** 校验Token,返回用户信息* @param token* @return*/public User verify(String token){DecodedJWT decode = JWT.decode(token);String userId = decode.getAudience().get(0);User user = userService.getById(userId);//获取校验器JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256(user.getPwd())).build();jwtVerifier.verify(token);return user;}
}

测试一下jwt

首先,我们写一个根据token获取User的接口。

@GetMapping("/jwt/test")
public User jwtTest(HttpServletRequest request){String token = request.getHeader("Token");User user = jwtUtil.verify(token);return user;
}

然后,改写login方法生成一下Token:

@GetMapping("/jwt/login")
public String jwtLogin(String username,String password){User user = userService.getByUsername(username);if(Objects.nonNull(user)) {if (!user.getPwd().equals(password)) {return "密码错误!";}}String token = jwtUtil.createToken(user);return token;
}

用postman发登录接口

得到Token:

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJhdWQiOiIxIiwiZXhwIjoxNzAzNTU5MjIzfQ.QFGXF6ZkQjmUtVEuDb8c1h_tFHAXE7G_WaSOuOkeBAA

再把Token放到Header,发测试接口:

成功了。

优化:将过期时间配置在文件中

我们目前过期时间是写死的,这样并不好,属于硬编码了。更恰当的方法是写在yml配置文件,或者Apollo中。

现在我们项目没有用Apollo,我们就改成配置文件吧。

在JwtUtil中添加配置:

@Value("${jwt.expire.offset:}")
Integer expireOffset;

yml中:

代码:

jwt:expire:offset: 30

单位是秒,所以创建Token的地方也改下:

public String createToken(User user){return JWT.create().withAudience(user.getId().toString()) // 设置载荷.withExpiresAt(DateUtil.offsetSecond(new Date(), expireOffset)) // 设置签名过期的时间.sign(Algorithm.HMAC256(user.getPwd())); // 签名 Signature
}

如果过期了,后台会报错,比如: com.auth0.jwt.exceptions.TokenExpiredException: The Token has expired on Mon Dec 25 11:10:33 CST 2023.

答疑:反正都能解析,加密有啥用?

已知在JWT的处理过程中,密钥(本项目中使用的密钥是password)在签名和验证阶段都起着关键作用。

对于DecodedJWT decode = JWT.decode(token);这行代码,实际上只是将JWT字符串解析为一个可操作的对象,并没有进行签名的验证。在这个阶段,确实不需要密钥。

但是,当你想要验证这个token的签名是否有效时,就需要使用到密钥了。例如,在代码中的这部分:

JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256(user.getPwd())).build();
jwtVerifier.verify(token);

总结一下,虽然JWT.decode(token)本身不需要密钥,但要确保JWT的有效性和真实性(比如过期时间),验证签名的过程是必要的,而这确实需要使用到密钥。

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

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

相关文章

Unitree H1,国内第一台能跑的全尺寸通用人形机器人

原创 | 文 BFT机器人 随着科技的不断发展&#xff0c;机器人技术已经逐渐渗透到各个领域&#xff0c;为人类的生产和生活带来了极大的便利。2023年可以说是通用人形机器人的高光之年&#xff0c;国内外不少机器人和科技团队纷纷发布了人形机器人原型机或产品规划&#xff0c;甚…

Python爬虫---解析---BeautifulSoup

BeautifulSoup简称&#xff1a;bs4 作用&#xff1a;解析和提取数据 1. 安装&#xff1a;pip install bs4 或pip install bs4 -i https://pypi.douban.com/simple&#xff08;使用国内镜像下载&#xff09; 注意&#xff1a;需要安装在python解释器相同的位置,例如&#xf…

外贸中的很多跟想的不一样的事情

说说最近遇到的几个客户情况&#xff0c;以及对一些事情刷新的认知。 第一个客户姑且称为A吧&#xff0c;这个客户在询价的时候&#xff0c;产品的名称以及数量以还有走货的方式写的很清楚&#xff0c;客户A要的产品不是很多&#xff0c; 顶多算是个样品单。 一般情况下&…

23-二分-值域二分-制作 m 束花所需的最少天数

这是二分法的第23篇算法&#xff0c;力扣链接。 给你一个整数数组 bloomDay&#xff0c;以及两个整数 m 和 k 。 现需要制作 m 束花。制作花束时&#xff0c;需要使用花园中 相邻的 k 朵花 。 花园中有 n 朵花&#xff0c;第 i 朵花会在 bloomDay[i] 时盛开&#xff0c;恰好 可…

前端性能优化三十四:花裤衩模板引入打包分析工具

测量各个插件和loader所花费的时间 (1). install: yarn add speed-measure-webpack-plugin -D(2). Vue-cli 3.x设置: const SpeedMeasurePlugin require(speed-measure-webpack-plugin) const smp new SpeedMeasurePlugin({outputFormat: human }) // 包裹configureWebpac…

PostgreSQL 可观测性最佳实践

简介 软件简述 PostgreSQL 是一种开源的关系型数据库管理系统 (RDBMS)&#xff0c;它提供了许多可观测性选项&#xff0c;以确保数据库的稳定性和可靠性。 可观测性 可观测性&#xff08;Observability&#xff09;是指对数据库状态和操作进行监控和记录&#xff0c;以便在…

Linux操作系统——进程(四)进程切换与命令行参数

进程切换 概念引入 下面我们先了解几个概念&#xff1a; 竞争性: 系统进程数目众多&#xff0c;而CPU资源只有少量&#xff0c;甚至1个&#xff0c;所以进程之间是具有竞争属性的。为了高效完成任务&#xff0c;更合理竞争相关资源&#xff0c;便具有了优先级 独立性: 多进程…

Java 基础面试

1 JDK 和 JRE 有什么区别&#xff1f; DK&#xff08;Java Development Kit&#xff09;是Java开发工具包的缩写&#xff0c;它包含了Java编译器&#xff08;javac&#xff09;、Java虚拟机&#xff08;JVM&#xff09;和其他开发工具。JDK提供了开发Java应用程序所需的所有…

[论文阅读笔记28] 对比学习在多目标跟踪中的应用

这次做一篇2D多目标跟踪中使用对比学习的一些方法. 对比学习通过以最大化正负样本特征距离, 最小化正样本特征距离的方式来实现半监督或无监督训练. 这可以给训练MOT的外观特征网络提供一些启示. 使用对比学习做MOT的鼻祖应该是QDTrack, 本篇博客对QDTrack及其后续工作做一个总…

Linux OpenEuler(欧拉系统)无公网ip实现SSH远程连接

&#x1f525;博客主页&#xff1a; 小羊失眠啦. &#x1f3a5;系列专栏&#xff1a;《C语言》 《数据结构》 《Linux》《Cpolar》 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;…

研究生可以直接当教师吗

在教育领域&#xff0c;教师岗位的竞争日益激烈。许多即将毕业的研究生&#xff0c;尤其是教育学专业的&#xff0c;都怀揣着一个共同的疑问&#xff1a;我能不能一出校门就直接当教师&#xff1f; 成为教师并不只是有个学历那么简单。它需要具备扎实的教育学基础、良好的教学技…

1.3 Python高级编程-生成器

摘要&#xff1a; 在Python编程中&#xff0c;生成器是一种特殊类型的迭代器&#xff0c;它允许你在需要时动态生成值。生成器使用关键字yield来返回一个值&#xff0c;这使得它们非常适合处理大量数据或执行计算密集型任务。在本教程中&#xff0c;我们将介绍生成器的基础知识…

Java 接口默认方法和静态方法

Java 8 引入的新特性 默认方法&#xff1a;Java 8&#xff08;发布于2014年3月&#xff09;开始&#xff0c;接口中可以定义带有实现的方法&#xff0c;称为默认方法&#xff08;Default Methods&#xff09;。静态方法&#xff1a;同样从Java 8开始&#xff0c;接口还可以定义…

Matlab:解非线性方程组

1、基于问题求解非线性方程组 例&#xff1a; xoptimvar(x,2); %将x定义为一个二元素优化变量 eq1exp(-exp(-(x(1)x(2))))x(2)*(1x(1)^2); %创建第一个方程作为优化等式表达式 eq2x(1)*cos(x(2))x(2)*sin(x(1))1/2; %创建第二个方程作为优化等式表达式 probe…

【数据结构和算法】找到最高海拔

其他系列文章导航 Java基础合集数据结构与算法合集 设计模式合集 多线程合集 分布式合集 ES合集 文章目录 其他系列文章导航 文章目录 前言 一、题目描述 二、题解 2.1 前缀和的解题模板 2.1.1 最长递增子序列长度 2.1.2 寻找数组中第 k 大的元素 2.1.3 最长公共子序列…

一台机器搭建Redis 主从复制

机器IP&#xff1a; 192.168.1.10主机配置&#xff1a; protected-mode no port 6379 pidfile /var/run/redis_6379.pid requirepass foobaredslave端配置 protected-mode no port 16379 pidfile /var/run/redis_16379.pid requirepass foobaredslaveof 192.168.1.10 6379 m…

fpga verilog rs232 发送模块实现

RS-232是一种串行通信协议&#xff0c;用于在计算机和其他外部设备之间进行数据传输。RS-232定义了电气特性、信号级别、机械特性和传输速率等规范&#xff0c;为串行通信提供了一种标准化的接口。 RS-232通常使用DB9连接器&#xff0c;用于传输和接收数据、控制信号以及地线连…

12月25日作业

串口发送控制命令&#xff0c;实现一些外设LED 风扇 uart4.c #include "uart4.h"void uart4_config() {//1.使能GPIOB\GPIOG\UART4外设时钟RCC->MP_AHB4ENSETR | (0x1 << 1);RCC->MP_AHB4ENSETR | (0x1 << 6);RCC->MP_APB1ENSETR | (0x1 <…

边缘计算云边端全览—边缘计算系统设计与实践【文末送书-10】

文章目录 一.边缘计算1.1边缘计算的典型应用 二.边缘计算 VS 云计算三.边缘计算系统设计与实践【文末送书-10】3.1 粉丝福利&#xff1a;文末推荐与福利免费包邮送书&#xff01; 一.边缘计算 边缘计算是指在靠近物或数据源头的一侧&#xff0c;采用网络、计算、存储、应用核心…