JWT 生成Token、解析Token的简单工具类

pom.xml导入依赖:

1
2
3
4
5
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.1</version>
</dependency>

JwtTokenManager工具类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
import com.atguigu.security.entity.User;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.CompressionCodecs;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
* @author : 其然乐衣Letitbe
* @date : 2022/11/12
*/
public class JwtTokenManager {

/**
* 用于签名的私钥
*/
private final String PRIVATE_KEY = "516Letitbe";

/**
* 签发者
*/
private final String ISSUER = "Letitbe";

/**
* 过期时间 1 小时
*/
private final long EXPIRATION_ONE_HOUR = 3600L;

/**
* 过期时间 1 天
*/
private final long EXPIRATION_ONE_DAY = 3600 * 24;

/**
* 生成Token
* @param user token存储的 实体类 信息
* @param expireTime token的过期时间
* @return
*/
public String createToken(User user, long expireTime) {
// 过期时间
if ( expireTime == 0 ) {
// 如果是0,就设置默认 1天 的过期时间
expireTime = EXPIRATION_ONE_DAY;
}

Map<String, Object> claims = new HashMap<>();
// 自定义有效载荷部分, 将User实体类用户名和密码存储
claims.put("id", user.getId());
claims.put("username", user.getUsername());
claims.put("password", user.getPassword());

String token = Jwts.builder()
// 发证人
.setIssuer(ISSUER)
// 有效载荷
.setClaims(claims)
// 设定签发时间
.setIssuedAt(new Date())
// 设置有效时长
.setExpiration(new Date(System.currentTimeMillis() + expireTime))
// 使用HS512算法签名,PRIVATE_KEY为签名密钥
.signWith(SignatureAlgorithm.HS512, PRIVATE_KEY)
// compressWith() 压缩方法,当载荷过长时可对其进行压缩
// 可采用jjwt实现的两种压缩方法CompressionCodecs.GZIP和CompressionCodecs.DEFLATE
.compressWith(CompressionCodecs.GZIP)
// 生成JWT
.compact();
return token;
}

/**
* 获取token中的User实体类
* @param token
* @return
*/
public User getUserFromToken(String token) {
// 获取有效载荷
Claims claims = getClaimsFromToken(token);
// 解析token后,从有效载荷取出值
String id = (String) claims.get("id");
String username = (String) claims.get("username");
String password = (String) claims.get("password");
// 封装成User实体类
User user = new User();
user.setId( id );
user.setUsername( username );
user.setPassword( password );
return user;
}

/**
* 获取有效载荷
* @param token
* @return
*/
public Claims getClaimsFromToken(String token){
Claims claims = null;
try {
claims = Jwts.parser()
//设定解密私钥
.setSigningKey(PRIVATE_KEY)
//传入Token
.parseClaimsJws(token)
//获取载荷类
.getBody();
}catch (Exception e){
return null;
}
return claims;
}
}

测试:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@Test
public void czyTokenTest() {
User user = new User();
user.setId("1arg232t3tg231235");
user.setUsername("其然乐衣");
user.setPassword("2000516");

String token = jwtTokenManager.createToken(user, 0L);
System.out.println("生成的token: ");
System.out.println(token);
User userFromToken = jwtTokenManager.getUserFromToken(token);
System.out.println("userFromToken:");
System.out.println(userFromToken);
}

image-20221112165845740