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

从JWT Claims提取Subject时getSubject()方法返回null问题排查

问题原因及解决方案

问题出在JWT令牌生成的逻辑上:你在调用setSubject(login)之后又调用了setClaims(extraClaims),而setClaims方法会完全替换当前的Claims集合,这就导致之前设置的subject被清空,所以提取时返回null。

两种修复方式

方式一:调换setClaims和setSubject的顺序

先设置额外Claims,再设置subject,这样subject会被添加到已有的Claims中,不会被覆盖:

public String generateToken(@NotNull String login, @NotNull HashMap<String, Object> extraClaims) {
    return Jwts.builder()
            .setClaims(extraClaims)
            .setSubject(login)
            .setIssuedAt(new Date())
            .setExpiration(new Date(System.currentTimeMillis() + tokenValidity * 1000))
            .signWith(key)
            .compact();
}

方式二:使用addClaims替代setClaims

addClaims方法会将额外的Claims合并到现有集合中,而不是替换,这样之前设置的subject会被保留:

public String generateToken(@NotNull String login, @NotNull HashMap<String, Object> extraClaims) {
    return Jwts.builder()
            .setSubject(login)
            .addClaims(extraClaims)
            .setIssuedAt(new Date())
            .setExpiration(new Date(System.currentTimeMillis() + tokenValidity * 1000))
            .signWith(key)
            .compact();
}

选择任意一种方式修改后,再运行测试就能正常提取到subject了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 10:57:16