在使用jjwt创建JWT时Claims和subject之间的一个小坑
- 在创建jwt过程中,如果前面已经设置了setSubject,后面再设置setClaims的时候,会将前面内置的subject内容覆盖掉,但是claims里面的内容可以正常显示;原因是在setClaims的方法里面,已经有setSubject,所以会将之前设置的内容覆盖掉,所以要注意使用setClaims这个方法的时候要将它移动到上面,避免覆盖。
例如 改之前代码:
String token = Jwts.builder().setHeaderParam("typ", "JWT")
.setSubject("11221")
.setClaims(map)
.setIssuedAt(nowDate)
.setExpiration(expireDate)
.signWith(SignatureAlgorithm.HS256,SIGN_KEY)
.compact();
测试结果:
改之后代码块:
String token = Jwts.builder().setHeaderParam("typ", "JWT")
.setClaims(map)
.setSubject("11221")
.setIssuedAt(nowDate)
.setExpiration(expireDate)
.signWith(SignatureAlgorithm.HS256,SIGN_KEY)
.compact();
测试结果:
除过移动代码位置外还有几种写法来设置Claims,即不使用 builder.setClaims(map) 封装 ,因为会覆盖前面设置的参数。
改动代码如下:
JwtBuilder jwtBuilder = Jwts.builder().setHeaderParam("typ", "JWT")
.setSubject("11221")
.setIssuedAt(nowDate)
.setExpiration(expireDate)
.signWith(SignatureAlgorithm.HS256, SIGN_KEY);
//第一种
map.forEach((k,v)->{
jwtBuilder.claim(k,v);
});
//第二种
Set<String> keys = map.keySet();
for (String key : keys){
jwtBuilder.claim(key,map.get(key));
}
//第三种
Set<Map.Entry<String, Object>> entries = map.entrySet();
for (Map.Entry<String, Object> entry : entries){
jwtBuilder.claim(entry.getKey(),entry.getValue());
}
String token1 = jwtBuilder.compact();
- 载荷部分存在两个属性:payload和claims。两个属性均可作为载荷,jjwt中二者只能设置其一,如果同时设置,在终端方法compact() 中将抛出异常