108 lines
2.8 KiB
Java
108 lines
2.8 KiB
Java
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();
|
||
}
|
||
|
||
}
|