diff --git a/IDEA/src/main/java/com/example/api/utils/JwtTokenUtil.java b/IDEA/src/main/java/com/example/api/utils/JwtTokenUtil.java new file mode 100644 index 00000000..a0134d08 --- /dev/null +++ b/IDEA/src/main/java/com/example/api/utils/JwtTokenUtil.java @@ -0,0 +1,130 @@ +package com.example.api.utils; + +import io.jsonwebtoken.Claims; +import io.jsonwebtoken.ExpiredJwtException; +import io.jsonwebtoken.Jwts; +import io.jsonwebtoken.SignatureAlgorithm; + +import java.util.*; +import java.util.logging.Logger; + +/** + * JwtTokenUtil 类用于处理 JSON Web Tokens (JWT)。 + * 此类提供生成、解析和验证 JWT 的功能。 + */ +public final class JwtTokenUtil { + // 在请求的 header 中的名字 + public final static String TOKEN_HEADER = "Authorization"; + + // 一个星期过期的时间(毫秒) + public final static long REMEMBER_EXPIRATION_TIME = 1000 * 60 * 60 * 24 * 7; + + // 一天过期的时间(毫秒) + public final static long EXPIRATION_TIME = 1000 * 60 * 60 * 24; + + // 应用密钥,用于 JWT 签名 + private static final String APP_SECRET = "logisticapi"; + + // JWT 前缀 + private static final String PREFIX = "logistics:"; + + // 角色权限声明的键 + private static final String ROLE_CLAIMS = "roles"; + + /** + * 检查 token 是否合法。 + * @param token 要检查的 token + * @return 如果 token 非空且以 PREFIX 开头,则返回 true,否则返回 false。 + */ + public static boolean checkToken(String token) { + if ("null".equals(token) || token == null || "".equals(token)){ + System.out.println("token为空"); + return false; + } + return token.startsWith(PREFIX); + } + + /** + * 生成 Token。 + * @param username 用户名 + * @param roles 用户角色数组 + * @param expiration 过期时间(毫秒) + * @return 生成的 JWT + */ + public static String createToken(String username, String[] roles, long expiration) { + System.out.println("---------------------------"); + System.out.println("username:"+username); + System.out.println("-----------------------"); + Map map = new HashMap<>(); + map.put(ROLE_CLAIMS, roles); + return PREFIX + Jwts.builder() + .setClaims(map) + .setIssuedAt(new Date()) + .setExpiration(new Date(System.currentTimeMillis() + expiration)) + .signWith(SignatureAlgorithm.HS256, APP_SECRET) + .setSubject(username) + .compact(); + } + + /** + * 获取 token body。 + * @param token 要解析的 token + * @return token 中的 claims 对象 + */ + private static Claims getTokenClaims(String token) { + token = token.substring(PREFIX.length()); + Claims claims = null; + try { + claims = Jwts.parser() + .setSigningKey(APP_SECRET) + .parseClaimsJws(token) + .getBody(); + } catch (ExpiredJwtException e) { + e.printStackTrace(); + } + return claims; + } + + /** + * 从 Token 中获取用户名。 + * @param token 要解析的 token + * @return token 中的用户名 + */ + public static String getUsername(String token) { + System.out.println("----gettoken----"); + System.out.println(getTokenClaims(token)); + System.out.println("-------------"); + System.out.println(getTokenClaims(token).getSubject()); + System.out.println("-------------"); + return getTokenClaims(token).getSubject(); + } + + /** + * 从 Token 中获取用户角色。 + * @param token 要解析的 token + * @return token 中的用户角色列表 + */ + public static List getTokenRoles(String token) { + List roles = new ArrayList<>(); + Object object = getTokenClaims(token).get(ROLE_CLAIMS); + if (object instanceof ArrayList) { + for (Object o : (List) object) { + roles.add((String) o); + } + } + for (String role : roles) { + System.out.println(role); + } + return roles; + } + + /** + * 校验 Token 是否过期。 + * @param token 要检查的 token + * @return 如果 token 已过期,则返回 true,否则返回 false。 + */ + public static boolean isExpiration(String token) { + return getTokenClaims(token).getExpiration().before(new Date()); + } +} +