上一节,,这里是另外一种实现jjwt组件的代码案例,主要包含创建token和解析token。
之前的相关内容:
代码案例:<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.1</version>
</dependency>
创建Token和解析Token
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.util.*;
public class CreateAndSignTokenDemo {
public static void main(String[] args) {
String token = generalToken();
System.out.println(token);
// 输出:
// eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ1c2VycyIsImlzcyI6IkZVUUktUEMiLCJleHAiOjE2MTM2Mzk4OTQsInVzZXJJZCI6IueUqOaIt0lEIiwiaWF0IjoxNjEzNjM5Mjk0LCJqdGkiOiI1YmEzZDUxYS1iYWNjLTQwOWUtOTNjMC04NTM3ZDFkMzAwMmEiLCJ1c2VybmFtZSI6IueUqOaIt-WQjeensCJ9.Y-Fzts0q1mjoGZW_LjRnnfFoutTZQenR1rIQ6cTEh3w
Claims claims = parseToken(token);
System.out.println(claims);
//输出:
//{sub=users, iss=auth0, exp=1613641143, userId=用户ID, iat=1613640543, jti=b9e415d1-425e-40b4-b62b-6d8240f46b6f, username=用户名称}
}
/**
* 生成密钥
*
* @return
*/
public static SecretKey generalKey() {
String stringKey = "7786df7fc3a34e26a61c034d5ec8245d";
byte[] encodedKey = Base64.getEncoder().encode(stringKey.getBytes());
SecretKey secretKey = new SecretKeySpec(encodedKey, 0, encodedKey.length, "AES");
return secretKey;
}
/**
* @return
*/
public static String generalToken() {
try {
// 设置签发算法
SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;
// 生成密钥
SecretKey key = generalKey();
// 设置私有声明
Map<String, Object> claims = new HashMap<>(16);
claims.put("userId", "用户ID");
claims.put("username", "用户名称");
// 记录生成JWT的时间
long nowMillis = System.currentTimeMillis();
Date nowTime = new Date(nowMillis);
// 设置过期时间 6分钟
long expMillis = nowMillis 10 * 60 * 1000;
Date expTime = new Date(expMillis);
// 创建tocken构建器实例
JwtBuilder jwtBuilder = Jwts.builder()
// 设置自己的私有声明
.setClaims(claims)
// 设置该tocken的Id,用于防止tocken重复
.setId(UUID.randomUUID().toString())
// 设置签发者
.setIssuer("auth0")
// 设置签发时间
.setIssuedAt(nowTime)
// 设置过期时间
.setExpiration(expTime)
// 设置tocken的签发对象
.setSubject("users")
// 设置签发算法和密钥
.signWith(signatureAlgorithm, key);
return jwtBuilder.compact();
} catch (Exception e) {
e.printStackTrace();
return "生成tocken失败";
}
}
/**
* 解析tocken,从中提取出声明信息,里面包含用户信息
*
* @param tocken
* @return
*/
public static Claims parseToken(String tocken) {
SecretKey key = generalKey();
// 获取tocken中的声明部分
Claims claims = Jwts.parser()
.setSigningKey(key)
.parseClaimsJws(tocken).getBody();
return claims;
}
}
Copyright © 2024 妖气游戏网 www.17u1u.com All Rights Reserved