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

