You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java 21中Jwts相关方法过时,求Spring Security下JWT解析最优方案

解决JJWT 0.12.5解析JWT时方法过时的问题

问题背景

我正在学习Spring Security模块,使用版本为0.12.5的Jwts库处理JWT令牌。按照教程编写的初始解析代码如下:

private Claims extractAllClaims(String token){
    return Jwts.parser()
            .setSigningKey(getSignInKey())
            .build()
            .parseSignedClaims(token)
            .getBody();
}

private Key getSignInKey(){
    byte[] keyBytes = Decoders.BASE64.decode(SECRET_KEY);
    return Keys.hmacShaKeyFor(keyBytes);
}

随后发现getBody、parseSignedClaims和setSigningKey方法均已过时,调整后代码仍依赖过时的setSigningKey:

private Claims extractAllClaims(String token){
    return Jwts.parser()
            .setSigningKey(getSignInKey())
            .build()
            .parseSignedClaims(token)
            .getPayload();
}

private Key getSignInKey(){
    byte[] keyBytes = Decoders.BASE64.decode(SECRET_KEY);
    return Keys.hmacShaKeyFor(keyBytes);
}

查阅旧问题仍包含过时代码,寻求更优实现方式。

最优实现方案

1. 替换过时方法

在JJWT 0.12.x版本中,官方推荐使用verifyWith替代setSigningKey,同时用getPayload替代getBody,最终代码如下:

private Claims extractAllClaims(String token) {
    return Jwts.parser()
            .verifyWith(getSignInKey()) // 替代过时的setSigningKey
            .build()
            .parseSignedClaims(token)
            .getPayload(); // 替代过时的getBody
}

private Key getSignInKey() {
    byte[] keyBytes = Decoders.BASE64.decode(SECRET_KEY);
    return Keys.hmacShaKeyFor(keyBytes);
}
  • verifyWith(Key):语义更清晰,明确表示用该密钥验证JWT签名,是setSigningKey的官方替代方法
  • getPayload():符合JWT标准术语,和原getBody功能完全一致

2. 性能优化:缓存JwtParser实例

由于JwtParser是线程安全的,可以将其缓存为类成员变量,避免每次解析都重复创建实例,提升性能:

// 缓存线程安全的JwtParser实例
private final JwtParser jwtParser;
private final String SECRET_KEY;

// 在构造方法中初始化Parser
public YourJwtService(String secretKey) {
    this.SECRET_KEY = secretKey;
    this.jwtParser = Jwts.parser()
            .verifyWith(getSignInKey())
            .build();
}

private Claims extractAllClaims(String token) {
    return jwtParser.parseSignedClaims(token).getPayload();
}

private Key getSignInKey() {
    byte[] keyBytes = Decoders.BASE64.decode(SECRET_KEY);
    return Keys.hmacShaKeyFor(keyBytes);
}

内容的提问来源于stack exchange,提问作者Al3x4ndru1

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 19:42:39