项目先后端分离,请求认证使用的是JWT无状态认证。最近遇到一个问题,认证token须要从token中获取用户名,可是这个token有多是过时的。通常取得用户名用的是下面的代码。java
private Claims getClaimsFromToken(String token) {
return Jwts.parser()
.setSigningKey(SECRET)
.parseClaimsJws(token)
.getBody();
}
复制代码
若是token没有过时,则能够经过Claims.getSubject()得到用户名。可是token过时,则会抛出ExpiredJwtException异常,致使没法获取用户名。后端
查看ExpiredJwtException异常,会发现它的父类ClaimJwtException封装了Claims类成员。因此只要调用getClaims()方法就能够取得Claim对象,进而取得用户名。前后端分离
public abstract class ClaimJwtException extends JwtException {
public static final String INCORRECT_EXPECTED_CLAIM_MESSAGE_TEMPLATE = "Expected %s claim to be: %s, but was: %s.";
public static final String MISSING_EXPECTED_CLAIM_MESSAGE_TEMPLATE = "Expected %s claim to be: %s, but was not present in the JWT claims.";
private final Header header;
private final Claims claims;
protected ClaimJwtException(Header header, Claims claims, String message) {
super(message);
this.header = header;
this.claims = claims;
}
protected ClaimJwtException(Header header, Claims claims, String message, Throwable cause) {
super(message, cause);
this.header = header;
this.claims = claims;
}
public Claims getClaims() {
return this.claims;
}
public Header getHeader() {
return this.header;
}
}
复制代码
取得用户名的代码以下。this
/** * 从token中获取用户名 */
public String getUsernameFromToken(String token) {
try {
return getClaimsFromToken(token).getSubject();
} catch (ExpiredJwtException e) {
// 过时则从ExpiredJwtException中取username
return e.getClaims().getSubject();
}
}
复制代码