更新
2024/2/27 勘误
正文
来到这个网站可以看到各个语言实现的Jwt库,我们选择Java进行寻找。我的需求非常简单,api没有这么简陋,维护频繁,版本较为完善。
我推荐java-jwt
,nimbus-jose-jwt
,JJWT
虽然轻,但是api简陋,而且还没有到1.0版本,也有几个也是这样的情况。
但是我发现java-jwt
的文章竟然不多,我就来封装一个吧。
java-jwt仓库
/**
* Jwt工具类
* @author: thehanged
* @date 2024/2/19
**/
@Slf4j
@Component
public class JwtUtil {
/**
* 签发人
*/
@Value("${jwt.issuer}")
private String issuer;
/**
* 加密算法
*/
private Algorithm algorithm;
/**
* 秘钥
*/
@Value("${jwt.secret}")
private String secret;
// 私有函数用来指定默认算法器
private void DefaultAlgorithm(){
if(Objects.isNull(this.algorithm)){
this.algorithm = Algorithm.HMAC256(secret);
}
}
public JwtUtil(){
}
/**
* 生成 Token
* @parm username
* @return String
*/
public String generateToken(String username){
this.DefaultAlgorithm();
Calendar calendar = Calendar.getInstance();
Date issuedTime = calendar.getTime();
// 七天有效期
calendar.add(Calendar.DAY_OF_YEAR, 7);
Date expiresTime = calendar.getTime();
try {
String token = JWT.create()
.withIssuer(issuer) // 设置发行人
.withSubject(username)
.withIssuedAt(issuedTime) // 设置签发时间
.withExpiresAt(expiresTime) // 设置过期时间
.sign(algorithm);
return token;
} catch (JWTCreationException exception){
// 生成失败会抛出异常
}
return null;
}
/**
* 校验Token
* 校验不成功会抛出JWTVerificationException异常,并返回null
* @param token
* @return DecodedJWT
*/
public DecodedJWT VerifyToken(String token){
this.DefaultAlgorithm();
try {
JWTVerifier verifier = JWT.require(algorithm)
.withIssuer(issuer)
.build();
return verifier.verify(token);
}catch (InvalidClaimException e){
// 无效的令牌
} catch (TokenExpiredException e){
// 令牌过期
}
return null;
}
}
说明:
该函数不建议使用单例模式,在业务中往往是直接通过spring进行注入。为什么要给一个默认的算法器,在实际运用中,整个业务使用的token也有主副之分,主要要使用的加密算法设置为默认,不提供修改的方式主要是为了维护一致性,生成token和解析token的算法必须是同一种。
部分参考
https://www.cnblogs.com/hlkawa/p/13675792.html
将会持续更新~