diff --git a/src/main/java/com/zsz/util/JwtHelper.java b/src/main/java/com/zsz/util/JwtHelper.java index 4baaeaf..ec4aa2f 100644 --- a/src/main/java/com/zsz/util/JwtHelper.java +++ b/src/main/java/com/zsz/util/JwtHelper.java @@ -1,99 +1,152 @@ 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 { - private static long tokenExpiration = 24*60*60*1000; + // 定义 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; + // 判断令牌是否为空 + if (StringUtils.isEmpty(token)) return null; + // 使用签名密钥解析 JWT 令牌 Jws claimsJws = Jwts.parser().setSigningKey(tokenSignKey).parseClaimsJws(token); + // 获取 JWT 中的声明信息 Claims claims = claimsJws.getBody(); - Integer userId = (Integer)claims.get("userId"); + // 从声明中获取用户 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 claimsJws - = Jwts.parser().setSigningKey(tokenSignKey).parseClaimsJws(token); + // 判断令牌是否为空 + if (StringUtils.isEmpty(token)) return null; + // 使用签名密钥解析 JWT 令牌 + Jws claimsJws = Jwts.parser().setSigningKey(tokenSignKey).parseClaimsJws(token); + // 获取 JWT 中的声明信息 Claims claims = claimsJws.getBody(); - return (Integer)(claims.get("userType")); + // 从声明中获取用户类型并返回 + return (Integer) (claims.get("userType")); } - //从token字符串获取userName + /** + * 从 JWT 令牌字符串中获取用户名 + * @param token JWT 令牌字符串 + * @return 用户名,如果令牌为空则返回空字符串 + */ public static String getUserName(String token) { - if(StringUtils.isEmpty(token)) return ""; - Jws claimsJws - = Jwts.parser().setSigningKey(tokenSignKey).parseClaimsJws(token); + // 判断令牌是否为空 + if (StringUtils.isEmpty(token)) return ""; + // 使用签名密钥解析 JWT 令牌 + Jws claimsJws = Jwts.parser().setSigningKey(tokenSignKey).parseClaimsJws(token); + // 获取 JWT 中的声明信息 Claims claims = claimsJws.getBody(); - return (String)claims.get("userName"); + // 从声明中获取用户名并返回 + return (String) claims.get("userName"); } - //判断token是否有效 - public static boolean isExpiration(String token){ + /** + * 判断 JWT 令牌是否过期 + * @param token JWT 令牌字符串 + * @return 如果令牌过期则返回 true,否则返回 false + */ + public static boolean isExpiration(String token) { try { + // 解析 JWT 令牌并获取过期时间,判断是否在当前时间之前 boolean isExpire = Jwts.parser() .setSigningKey(tokenSignKey) .parseClaimsJws(token) .getBody() .getExpiration().before(new Date()); - //没有过期,有效,返回false + // 没有过期,有效,返回 false return isExpire; - }catch(Exception e) { - //过期出现异常,返回true + } catch (Exception e) { + // 过期出现异常,返回 true return true; } } - /** - * 刷新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)); // System.out.println(JwtHelper.getUserName(token)); } -} +} \ No newline at end of file