java使用JWT

引入依赖

官网上面链接很多java实现,这里使用java-jwt

1
2
3
4
5
<dependency>
<groupId>com.auth0</groupId>
<artifactId>java-jwt</artifactId>
<version>3.7.0</version>
</dependency>

创建util类

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
public class JWTUtils {

//密钥文本,密钥不要泄漏
private static String secret = "test-jwt";

/**
* 创建一个带有uid字段的token,过期时间为30分钟
*/
public static String create(Long uid) {
//JWT默认头部alg=HS256,typ=JWT,如果不更换加密方式可以不设置头部
Map<String, Object> header = new HashMap();
header.put("alg", "HS256");
header.put("typ", "JWT");

String token = JWT.create() //创建一个jwt对象
.withHeader(header) //设置Header(头部)
.withExpiresAt(new Date(System.currentTimeMillis() + 30L * 60 * 1000)) //设置过期时间为30分钟后,其他官方字段,后续追加即可
.withClaim("uid", uid) //设置自己的字段,字段名为uid。多个字段在后面继续使用withClaim()方法即可
.sign(Algorithm.HMAC256(secret)); //设置签名,签名算法为头部的HS256,密钥为secret变量的值
return token;
}

/**
* 解密token
*/
public static DecodedJWT decoded(String token){
JWTVerifier verifier = JWT.require(Algorithm.HMAC256(secret)).build();//创建一个加密算法为HS256的校验器
DecodedJWT decoded = verifier.verify(token); //校验传入的token,生成一个解密的JWT
return decoded;
}
}

测试

1
2
3
4
5
6
7
8
9
public static void main(String[] args) {
System.out.println("当前时间:" + new Date());
String token = create(1L);
System.out.println("token:" + token);

DecodedJWT decoded = decoded(token);
System.out.println("过期时间:" + decoded.getExpiresAt());
System.out.println("uid:" + decoded.getClaim("uid").asLong());
}

控制台:

1
2
3
4
当前时间:Tue Apr 07 20:48:47 CST 2020
token:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1aWQiOjEsImV4cCI6MTU4NjI2NTUyN30.vFel7jyAJpi1YxcFmnohbTDSKXHpC7EH8Kg8aQDmuN8
过期时间:Tue Apr 07 21:18:47 CST 2020
uid:1