一.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 {
@Test
void contextLoads() {
}
@Test
void textUuid() {
for (int i = 0; i < 1000; i++) {
String uuid = UUID.randomUUID().toString();
System.out.println(uuid);
}
}
/**
* 生成JWT令牌
* JWT第二部分负载 payload中存储的内容
*/
@Test
public 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中存储的内容
*/
@Test
public 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(),那么令牌构建成功后即刻过期,并不会成功解析。会报错: