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

如何用Jwts类提取Token的Claims?遇parserBuilder方法缺失问题

问题根源

你的项目中同时引入了两个版本的JJWT库:jjwt:0.9.1 和 jjwt-api/jjwt-impl/jjwt-jackson:0.11.5。这两个版本存在依赖冲突,Maven可能优先加载了旧版本的类文件,而parserBuilder()方法是JJWT 0.11.x版本才新增的API,旧版本0.9.1中并没有这个方法,所以你找不到它。

解决方法
  1. 删除POM中旧版本的JJWT依赖:
    <dependency>
        <groupId>io.jsonwebtoken</groupId>
        <artifactId>jjwt</artifactId>
        <version>0.9.1</version>
    </dependency>
    
  2. 保留0.11.5版本的拆分依赖(这是JJWT官方推荐的最新用法),并为运行时依赖添加scope标签:
    <dependency>
        <groupId>io.jsonwebtoken</groupId>
        <artifactId>jjwt-api</artifactId>
        <version>0.11.5</version>
    </dependency>
    <dependency>
        <groupId>io.jsonwebtoken</groupId>
        <artifactId>jjwt-impl</artifactId>
        <version>0.11.5</version>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>io.jsonwebtoken</groupId>
        <artifactId>jjwt-jackson</artifactId>
        <version>0.11.5</version>
        <scope>runtime</scope>
    </dependency>
    
  3. 执行Maven清理和重新安装:
    mvn clean install
    
修正后的JwtService代码示例

你的extractClaims方法代码不完整,这里给出完整实现(需替换为你的实际签名密钥):

@Service
public class JwtService {
    // 建议从配置文件读取签名密钥,避免硬编码
    private final String SECRET_KEY = "your-actual-secret-key";

    public String extractUserName(String jwt) {
        Claims claims = extractClaims(jwt);
        return claims.getSubject(); // 假设用户名存储在JWT的subject字段中
    }

    private Claims extractClaims(String jwt) {
        return Jwts.parserBuilder()
                .setSigningKey(Keys.hmacShaKeyFor(SECRET_KEY.getBytes()))
                .build()
                .parseClaimsJws(jwt)
                .getBody();
    }
}

注意:如果你的签名密钥是Base64编码格式,需要使用Keys.hmacShaKeyFor(Base64.getDecoder().decode(SECRET_KEY))来解析。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 02:39:55