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
相关产品推荐
相关产品推荐

