一.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(),那么令牌构建成功后即刻过期,并不会成功解析。会报错:

