登录-06.JWT令牌-生成和校验

devtools/2025/2/24 10:59:22/

 一.JWT令牌的生成和校验

JWT令牌生成

想要生成JWT令牌,那么就要首先引入JWT令牌的相关依赖,

<dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt-api</artifactId><version>0.11.2</version></dependency><dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt-impl</artifactId><version>0.11.2</version></dependency><dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt-gson</artifactId><version>0.11.2</version>
</dependency>

 在引入了JWT令牌的依赖后,我们在测试文件中编写代码来生成JWT令牌。

package com.gjw;import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import io.jsonwebtoken.io.Decoders;
import io.jsonwebtoken.security.Keys;
import jakarta.websocket.Decoder;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;import javax.crypto.SecretKey;
import java.util.*;//@SpringBootTest
class TliasWebManagementApplicationTests {@Testvoid contextLoads() {}@Testvoid textUuid() {for (int i = 0; i < 1000; i++) {String uuid = UUID.randomUUID().toString();System.out.println(uuid);}}/*** 生成JWT令牌* JWT第二部分负载 payload中存储的内容*/@Testpublic void testGenJwt() {Map<String, Object> claims = new HashMap<>();claims.put("name","Tom");claims.put("id",1);String jwt = Jwts.builder()     // 构建Jwt令牌.signWith(SignatureAlgorithm.HS256, "handsomegaojiaweilovesbeautifulmengxinruloveforever")  // 选择签名算法,设置签名密钥.setClaims(claims)      // 添加负载信息(自定义内容).setExpiration(new Date(System.currentTimeMillis() + 3600 * 1000))      //  设置JWT令牌的有效期.compact();     //  获取JWT令牌的数据载荷部分System.out.println(jwt);}
}

首先我们生成JWT令牌,调用工具类Jwts的builder()方法来生成令牌,通过链式编程,然后再调用signWith()方法来指定签名算法,我们指定签名算法为HS256,指定签名密钥为"handsomegaojiaweilovesbeautifulmengxinruloveforever"。然后通过setClaims来添加负载信息(自定义内容)。其中setClaims方法的参数是一个map类型的数据。我们定义为HashMap并设置键值对为("name","Tom")和("id",1)。然后我们通过setExpiration来指定JWT令牌的过期时间,设置为当前时间再加上1个小时(3600毫秒×1000=3600秒=1hour)。最终通过conpact()方法将JWT令牌转换为字符串。

我们将运行出来的结果进行打印:

eyJhbGciOiJIUzI1NiJ9.eyJuYW1lIjoiVG9tIiwiaWQiOjEsImV4cCI6MTc0MDMyMjUwNn0.c51zapcmXAxW_Vc-V-jxu3EqTi0vjMXI7EUhJcmMqjY

 JWT令牌校验

我们对生成的JWT令牌进行校验,通过parserBuilder()方法来解析JWT令牌,然后调用setSigningKey()方法传入签名密钥,并且调用.build()方法来创建解析器,调用.parseClaimsJws()方法传入生成的JWT令牌,并调用getBody()方法获取有效载荷。将获取到的有效载荷打印出来。

    /*** 解析JWT令牌* JWT第二部分负载 payload中存储的内容*/@Testpublic void testParseJwt() {//解析jwt令牌,获取- Payload(有效载荷)Claims claims = Jwts.parserBuilder()    // 使用 parserBuilder() 解析JWT令牌.setSigningKey("handsomegaojiaweilovesbeautifulmengxinruloveforever")   // 设置签名密钥.build()    // 创建解析器// 解析JWT令牌.parseClaimsJws("eyJhbGciOiJIUzI1NiJ9.eyJuYW1lIjoiVG9tIiwiaWQiOjEsImV4cCI6MTczNDEwNjkzNX0.7D3qaFCrhZmH0QAyrchLyWn4OQvzA_vlnrBjyJEMDzI").getBody();     // 获取有效载荷System.out.println(claims);}

结果如下:

{name=Tom, id=1.0, exp=1.740322506E9}

可以发现其有效载荷部分和我们在构建JWT令牌中的有效载荷部分相同。

请注意,我们设置的JWT令牌的有效期是令牌生成后一个小时,如果没有加上一个小时而设置为new Date(System.currentTimeMillis(),那么令牌构建成功后即刻过期,并不会成功解析。会报错:


http://www.ppmy.cn/devtools/161346.html

相关文章

My second Android application

实现功能&#xff1a;Activity之间的切换与传递值 MainActivity&#xff1a; val greetingText findViewById<TextView>(R.id.printer)val inputField findViewById<EditText>(R.id.inputer)val submitButton findViewById<Button>(R.id.btn)submitButto…

高速PCB电源层

高速PCB电源层 一、电源层分割 1.分析电流供电走向 2.合理划分区域 3.过孔数量放置&#xff0c;载流能力考虑 二、跨分割&#xff1a; 跨分割主要指电源平面或者低分面分割导致信号走线参考平面不完整&#xff0c;使得信号在传输过程从一个平面跨接到另一个电源面。 1.跨分…

22.回溯算法4

递增子序列 这里不能排序&#xff0c;因为数组的顺序是对结果有影响的&#xff0c;所以只能通过used数组来去重 class Solution { public:vector<int> path;vector<vector<int>> res;void backtracking(vector<int>& nums,int start){if(path.si…

设计模式-observer模式(观察者模式)

解释 观察者模式用于建立对象间的一对多依赖&#xff0c;当主题&#xff08;Subject&#xff09;状态变化时&#xff0c;所有观察者&#xff08;Observers&#xff09;自动收到通知。 Observer 模式应该可以说是应用最多、影响最广的模式之一&#xff0c;因为 Observer 的一个…

Spring Boot Validation 接口校验:从零到掌握

在开发 Web 应用时&#xff0c;数据校验是不可忽视的一部分。无论是注册用户信息、提交表单数据&#xff0c;还是处理业务逻辑&#xff0c;数据的有效性和完整性都需要得到保证。Spring Boot 提供了强大的验证功能&#xff0c;基于 Hibernate Validator 框架&#xff0c;通过注…

对计算机中缓存的理解和使用Redis作为缓存

使用Redis作为缓存缓存例子缓存的引入 Redis缓存的实现 使用Redis作为缓存 缓存 ​什么是缓存&#xff0c;第一次接触这个东西是在考研学习408的时候&#xff0c;计算机组成原理里面学习到Cache缓存&#xff0c;用于降低由于内存和CPU的速度的差异带来的延迟。它是在CPU和内存…

机器学习数学通关指南——微分中值定理和积分中值定理

前言 本文隶属于专栏《机器学习数学通关指南》&#xff0c;该专栏为笔者原创&#xff0c;引用请注明来源&#xff0c;不足和错误之处请在评论区帮忙指出&#xff0c;谢谢&#xff01; 本专栏目录结构和参考文献请见《机器学习数学通关指南》 正文 1. 定义与核心结论 积分中值…

git设置本地代理

# 设置 HTTP 代理 git config --global http.proxy http://<username>:<password><proxy-host>:<proxy-port># 设置 HTTPS 代理 git config --global https.proxy https://<username>:<password><proxy-host>:<proxy-port>例如…