今天学习 JWT 时遇到一个坑:生成的 token 设置了过期时间却没有过期

遇到的问题:生成的 token 设置了过期时间却没有过期

产生问题的原因:setExpiration 方法 和 setClaims 方法调用顺序的问题


原因分析:


查看 setExpiration 方法的源码,当我们设置了过期时间时 exp != null ,这时会走到 ensureClaims().setExpiration(exp);

@Override
public JwtBuilder setExpiration(Date exp) {
if (exp != null) {
ensureClaims().setExpiration(exp);
} else {
if (this.claims != null) {
//noinspection ConstantConditions
this.claims.setExpiration(exp);
}
}
return this;
}


然后再查看 ensureClaims 方法的源码可以发现,如果我们没有事先设置 claims ,那么在这里会产生一个 DefaultClaims 对象赋值给 DefaultJwtBuilder 类的 claims 属性,这个对象将调用 setExpiration(exp) 方法设置过期时间

protected Claims ensureClaims() {
if (this.claims == null) {
this.claims = new DefaultClaims();
}
return this.claims;
}


但如果在这之后我们再调用 setClaims 方法,那么我们新设置的 claims 将重新赋值到 DefaultJwtBuilder 类的 claims 属性

@Override
public JwtBuilder setClaims(Map<String, ?> claims) {
this.claims = new DefaultClaims(claims);
return this;
}

此时新构造出来的 DefaultClaims 对象没有进行设置过期时间的操作,这也就导致了最后生成的 token 没有过期时间


解决方法:应该先调用 setClaims 方法再调用 setExpiration 方法

0个评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
下载 APP