<!-- jwt -->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>${jjwt.version}</version>
</dependency>
<jjwt.version>0.9.1</jjwt.version>
yml配置文件
# JWT配置
jwt:
# 密匙Key
token-secret: WangKun
# HeaderKey
token-header-key: Authorization
# Token前缀
token-prefix: WangKun
# 过期时间,单位秒
token-expiration: 864000
获取token信息
/**
* @Description JWT令牌信息
* @Author WangKun
* @Date 2024/1/30 18:24
* @Version
*/
@Data
@Component
public class JwtInfoConfig {
/**
* token响应头Key
*/
public static String tokenHeaderKey;
/**
* token前缀
*/
public static String tokenPrefix;
/**
* token秘钥
*/
public static String tokenSecret;
/**
* token过期时间
*/
public static Long tokenExpiration;
@Value("${jwt.token-header-key}")
public void setTokenHeaderKey(String tokenHeaderKey) {
JwtInfoConfig.tokenHeaderKey = tokenHeaderKey;
}
@Value("${jwt.token-prefix}")
public void setTokenPrefix(String tokenPrefix) {
JwtInfoConfig.tokenPrefix = tokenPrefix;
}
@Value("${jwt.token-secret}")
public void setTokenSecret(String tokenSecret) {
JwtInfoConfig.tokenSecret = tokenSecret;
}
@Value("${jwt.token-expiration}")
public void setTokenExpiration(Long tokenExpiration) {
JwtInfoConfig.tokenExpiration = tokenExpiration;
}
}
制作token
/**
* @Description Token令牌工具
* @Author WangKun
* @Date 2024/2/1 15:33
* @Version
*/
@Slf4j
public class TokenUtil {
/**
* @param username 用户名
* @param claimKey 有效负荷key(不加密,不要放隐私内容)
* @param claimValue 有效负荷value
* @Description 生成令牌
* @Throws
* @Return java.lang.String
* @Date 2024-02-01 16:10:49
* @Author WangKun
*/
public static String creatToken(String username, String claimKey, Object claimValue) {
//有效负荷
Claims claim = Jwts.claims();
claim.put(claimKey, claimValue);
//设置token响应头
return Jwts.builder()
//设置有效负荷
.setClaims(claim)
//设置用户名
.setSubject(username)
//设置token过期时间
.setExpiration(new Date(System.currentTimeMillis() + JwtInfoConfig.tokenExpiration))
//设置token签名算法及秘钥
.signWith(SignatureAlgorithm.HS512, JwtInfoConfig.tokenSecret).compact();
}
/**
* @param username
* @Description 生成令牌,无有效负荷
* @Throws
* @Return java.lang.String
* @Date 2024-02-01 18:21:53
* @Author WangKun
*/
public static String creatToken(String username) {
//设置token响应头
return Jwts.builder()
//设置用户名
.setSubject(username)
//设置token过期时间
.setExpiration(new Date(System.currentTimeMillis() + JwtInfoConfig.tokenExpiration))
//设置token签名算法及秘钥
.signWith(SignatureAlgorithm.HS512, JwtInfoConfig.tokenSecret).compact();
}
/**
* @param token
* @Description 解析令牌
* @Throws
* @Return com.alibaba.fastjson2.JSONObject
* @Date 2024-02-01 17:47:15
* @Author WangKun
*/
public static JSONObject analyzeToken(String token) {
Claims claims;
try {
// 解析token
claims = Jwts.parser().setSigningKey(JwtInfoConfig.tokenSecret).parseClaimsJws(token.replace(JwtInfoConfig.tokenPrefix + ".", "")).getBody();
return new JSONObject(new HashMap<>(claims));
} catch (ExpiredJwtException e) {
log.error("令牌过期:{},{}", e, e.getMessage());
throw new RuntimeException(String.valueOf(ResultCode.TOKEN_EXPIRED));
} catch (UnsupportedJwtException e) {
log.error("无效的令牌:{},{}", e, e.getMessage());
throw new RuntimeException(String.valueOf(ResultCode.TOKEN_INVALID));
} catch (MalformedJwtException e) {
log.error("令牌格式错误:{},{}", e, e.getMessage());
throw new RuntimeException(String.valueOf(ResultCode.TOKEN_FORMAT_ERROR));
} catch (SignatureException e) {
log.error("令牌签名错误:{},{}", e, e.getMessage());
throw new RuntimeException(String.valueOf(ResultCode.TOKEN_SIGNATURE_ERROR));
} catch (IllegalArgumentException e) {
log.error("非法令牌:{},{}", e, e.getMessage());
throw new RuntimeException(String.valueOf(ResultCode.TOKEN_ILLEGALITY));
} catch (Exception e) {
log.error("令牌解析错误:{},{}", e, e.getMessage());
throw new RuntimeException(String.valueOf(ResultCode.TOKEN_ANALYZE_ERROR));
}
}