package cn.van.business.util; import io.jsonwebtoken.Jwts; import io.jsonwebtoken.SignatureAlgorithm; import io.jsonwebtoken.security.Keys; import org.springframework.stereotype.Component; import java.util.Date; /** * JWT 工具类 * 提供 token 的生成、解析、验证和有效期管理功能 */ @Component public class JwtUtils { private final String secret = "your-secret-key"; // 应配置在 application.yml 中 private final long expiration = 86400000 * 7; // 24小时 /** * 生成一个新的 JWT Token * * @param username 用户名 * @param roles 用户角色(可选) * @return 返回生成的 JWT Token 字符串 */ // 生成 Token 时去掉 roles 参数 public String generateToken(String username) { return Jwts.builder() .setSubject(username) .setExpiration(new Date(System.currentTimeMillis() + expiration)) .signWith(SignatureAlgorithm.HS512, secret) .compact(); } /** * 从给定的 JWT Token 中提取用户名 * * @param token JWT Token * @return 提取的用户名 */ public String extractUsername(String token) { return Jwts.parser() .setSigningKey(secret) .parseClaimsJws(token) .getBody() .getSubject(); } /** * 获取 JWT Token 的过期时间 * * @param token JWT Token * @return 返回 token 的过期时间 (Date) */ public Date extractExpiration(String token) { return Jwts.parser() .setSigningKey(secret) .parseClaimsJws(token) .getBody() .getExpiration(); } /** * 验证指定的 JWT Token 是否有效 * * @param token JWT Token * @return 如果 token 有效则返回 true,否则返回 false */ public Boolean validateToken(String token) { return !isTokenExpired(token); } /** * 检查 token 是否已过期 * * @param token JWT Token * @return 如果已过期返回 true,否则返回 false */ private Boolean isTokenExpired(String token) { return extractExpiration(token).before(new Date()); } /** * 获取 JWT Token 的剩余有效时间(毫秒) * * @param token JWT Token * @return 剩余的有效时间(毫秒) */ public long getRemainingExpirationTime(String token) { long now = System.currentTimeMillis(); return Math.max(0, extractExpiration(token).getTime() - now); } /** * 获取 JWT Token 的过期时间(毫秒) * * @param token JWT Token * @return 返回 token 的过期时间戳(毫秒) */ public long getExpiration(String token) { return extractExpiration(token).getTime(); } }