|
|
|
@ -1,62 +1,108 @@
|
|
|
|
|
package com.zsz.util;
|
|
|
|
|
|
|
|
|
|
// 导入 JWT 相关的类,用于处理 JWT 的创建、解析等操作
|
|
|
|
|
import io.jsonwebtoken.*;
|
|
|
|
|
// 导入 Spring 框架的字符串工具类,用于判断字符串是否为空
|
|
|
|
|
import org.springframework.util.StringUtils;
|
|
|
|
|
|
|
|
|
|
// 导入日期类,用于处理时间相关的操作
|
|
|
|
|
import java.util.Date;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* JwtHelper 类提供了一系列与 JWT(JSON Web Token)相关的工具方法,
|
|
|
|
|
* 用于创建、解析和验证 JWT 令牌。
|
|
|
|
|
*/
|
|
|
|
|
public class JwtHelper {
|
|
|
|
|
// 定义 JWT 令牌的过期时间,这里设置为 24 小时,单位为毫秒
|
|
|
|
|
private static long tokenExpiration = 24 * 60 * 60 * 1000;
|
|
|
|
|
// 定义 JWT 令牌的签名密钥,用于对令牌进行签名和验证
|
|
|
|
|
private static String tokenSignKey = "123456";
|
|
|
|
|
|
|
|
|
|
//生成token字符串
|
|
|
|
|
/**
|
|
|
|
|
* 生成 JWT 令牌字符串
|
|
|
|
|
* @param userId 用户的 ID
|
|
|
|
|
* @param userType 用户的类型
|
|
|
|
|
* @return 生成的 JWT 令牌字符串
|
|
|
|
|
*/
|
|
|
|
|
public static String createToken(Long userId, Integer userType) {
|
|
|
|
|
// 使用 Jwts 构建器创建 JWT 令牌
|
|
|
|
|
String token = Jwts.builder()
|
|
|
|
|
|
|
|
|
|
// 设置 JWT 的主题
|
|
|
|
|
.setSubject("YYGH-USER")
|
|
|
|
|
|
|
|
|
|
// 设置 JWT 的过期时间,当前时间加上 tokenExpiration
|
|
|
|
|
.setExpiration(new Date(System.currentTimeMillis() + tokenExpiration))
|
|
|
|
|
|
|
|
|
|
// 在 JWT 中添加用户 ID 的声明
|
|
|
|
|
.claim("userId", userId)
|
|
|
|
|
// 注释掉的代码,可用于添加用户名的声明
|
|
|
|
|
// .claim("userName", userName)
|
|
|
|
|
// 在 JWT 中添加用户类型的声明
|
|
|
|
|
.claim("userType", userType)
|
|
|
|
|
|
|
|
|
|
// 使用 HS512 算法和签名密钥对 JWT 进行签名
|
|
|
|
|
.signWith(SignatureAlgorithm.HS512, tokenSignKey)
|
|
|
|
|
// 对 JWT 进行 GZIP 压缩
|
|
|
|
|
.compressWith(CompressionCodecs.GZIP)
|
|
|
|
|
// 构建最终的 JWT 令牌字符串
|
|
|
|
|
.compact();
|
|
|
|
|
return token;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//从token字符串获取userid
|
|
|
|
|
/**
|
|
|
|
|
* 从 JWT 令牌字符串中获取用户 ID
|
|
|
|
|
* @param token JWT 令牌字符串
|
|
|
|
|
* @return 用户的 ID,如果令牌为空则返回 null
|
|
|
|
|
*/
|
|
|
|
|
public static Long getUserId(String token) {
|
|
|
|
|
// 判断令牌是否为空
|
|
|
|
|
if (StringUtils.isEmpty(token)) return null;
|
|
|
|
|
// 使用签名密钥解析 JWT 令牌
|
|
|
|
|
Jws<Claims> claimsJws = Jwts.parser().setSigningKey(tokenSignKey).parseClaimsJws(token);
|
|
|
|
|
// 获取 JWT 中的声明信息
|
|
|
|
|
Claims claims = claimsJws.getBody();
|
|
|
|
|
// 从声明中获取用户 ID
|
|
|
|
|
Integer userId = (Integer) claims.get("userId");
|
|
|
|
|
// 将用户 ID 转换为 Long 类型并返回
|
|
|
|
|
return userId.longValue();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//从token字符串获取userType
|
|
|
|
|
/**
|
|
|
|
|
* 从 JWT 令牌字符串中获取用户类型
|
|
|
|
|
* @param token JWT 令牌字符串
|
|
|
|
|
* @return 用户的类型,如果令牌为空则返回 null
|
|
|
|
|
*/
|
|
|
|
|
public static Integer getUserType(String token) {
|
|
|
|
|
// 判断令牌是否为空
|
|
|
|
|
if (StringUtils.isEmpty(token)) return null;
|
|
|
|
|
Jws<Claims> claimsJws
|
|
|
|
|
= Jwts.parser().setSigningKey(tokenSignKey).parseClaimsJws(token);
|
|
|
|
|
// 使用签名密钥解析 JWT 令牌
|
|
|
|
|
Jws<Claims> claimsJws = Jwts.parser().setSigningKey(tokenSignKey).parseClaimsJws(token);
|
|
|
|
|
// 获取 JWT 中的声明信息
|
|
|
|
|
Claims claims = claimsJws.getBody();
|
|
|
|
|
// 从声明中获取用户类型并返回
|
|
|
|
|
return (Integer) (claims.get("userType"));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//从token字符串获取userName
|
|
|
|
|
/**
|
|
|
|
|
* 从 JWT 令牌字符串中获取用户名
|
|
|
|
|
* @param token JWT 令牌字符串
|
|
|
|
|
* @return 用户名,如果令牌为空则返回空字符串
|
|
|
|
|
*/
|
|
|
|
|
public static String getUserName(String token) {
|
|
|
|
|
// 判断令牌是否为空
|
|
|
|
|
if (StringUtils.isEmpty(token)) return "";
|
|
|
|
|
Jws<Claims> claimsJws
|
|
|
|
|
= Jwts.parser().setSigningKey(tokenSignKey).parseClaimsJws(token);
|
|
|
|
|
// 使用签名密钥解析 JWT 令牌
|
|
|
|
|
Jws<Claims> claimsJws = Jwts.parser().setSigningKey(tokenSignKey).parseClaimsJws(token);
|
|
|
|
|
// 获取 JWT 中的声明信息
|
|
|
|
|
Claims claims = claimsJws.getBody();
|
|
|
|
|
// 从声明中获取用户名并返回
|
|
|
|
|
return (String) claims.get("userName");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//判断token是否有效
|
|
|
|
|
/**
|
|
|
|
|
* 判断 JWT 令牌是否过期
|
|
|
|
|
* @param token JWT 令牌字符串
|
|
|
|
|
* @return 如果令牌过期则返回 true,否则返回 false
|
|
|
|
|
*/
|
|
|
|
|
public static boolean isExpiration(String token) {
|
|
|
|
|
try {
|
|
|
|
|
// 解析 JWT 令牌并获取过期时间,判断是否在当前时间之前
|
|
|
|
|
boolean isExpire = Jwts.parser()
|
|
|
|
|
.setSigningKey(tokenSignKey)
|
|
|
|
|
.parseClaimsJws(token)
|
|
|
|
@ -70,27 +116,34 @@ public class JwtHelper {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 刷新Token
|
|
|
|
|
* @param token
|
|
|
|
|
* @return
|
|
|
|
|
* 刷新 JWT 令牌
|
|
|
|
|
* @param token 原 JWT 令牌字符串
|
|
|
|
|
* @return 刷新后的 JWT 令牌字符串,如果刷新失败则返回 null
|
|
|
|
|
*/
|
|
|
|
|
public String refreshToken(String token) {
|
|
|
|
|
String refreshedToken;
|
|
|
|
|
try {
|
|
|
|
|
// 解析原 JWT 令牌获取声明信息
|
|
|
|
|
final Claims claims = Jwts.parser()
|
|
|
|
|
.setSigningKey(tokenSignKey)
|
|
|
|
|
.parseClaimsJws(token)
|
|
|
|
|
.getBody();
|
|
|
|
|
// 使用原令牌中的用户 ID 和用户类型重新生成新的 JWT 令牌
|
|
|
|
|
refreshedToken = JwtHelper.createToken(getUserId(token), getUserType(token));
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
|
// 刷新失败,返回 null
|
|
|
|
|
refreshedToken = null;
|
|
|
|
|
}
|
|
|
|
|
return refreshedToken;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 主方法,用于测试 JWT 相关功能
|
|
|
|
|
* @param args 命令行参数
|
|
|
|
|
*/
|
|
|
|
|
public static void main(String[] args) {
|
|
|
|
|
// 示例代码,可用于生成令牌并获取其中的信息
|
|
|
|
|
// String token = JwtHelper.createToken(1L, "lucy");
|
|
|
|
|
// System.out.println(token);
|
|
|
|
|
// System.out.println(JwtHelper.getUserId(token));
|
|
|
|
|