如何使JWT失效
程序员文章站
2024-03-20 20:04:46
...
最近在弄app接口,使用到JWT来管理token,关于JWT的优点,已经有很多博客介绍了,这里就不啰嗦了,讲一下我碰到的问题及解决方法.
问题
旧token不在服务器端存储,如何使其失效?
解决思路
用户表维护一个登录时间字段lastLoginDate,每次登录,退出,修改密码都更新此字段,
然后jwt生成时有个签发时间,根据签发时间比对登录时间,如果签发时间在登录时间前则视其为失效.
我的项目中用的jjwt(0.7.0版本),下面是代码示例
/**
* 生成jwt token
*/
public String generateToken(String userId,Boolean rememberMe) {
Date nowDate = new Date();
long expiration = rememberMe ? expireRemember : expire;
//过期时间
Date expireDate = new Date(nowDate.getTime() + expiration * 1000);
System.out.println("登录过期时间 >>>>"+DateUtils.formatDateTime(expireDate));
return Jwts.builder()
.setHeaderParam("typ", "JWT")
.setSubject(userId)
.setIssuedAt(nowDate)//签发时间
.setExpiration(expireDate)//过期时间
.signWith(SignatureAlgorithm.HS256, secret)
.compact();
}
/**
* token是否过期
* @return true:过期
* lastLoginDate 最后一次登录时间
* issueDate token 签发时间
*/
public boolean isTokenExpired(Date expiration,Date lastLoginDate,Date issueDate) {
//token签发时间小于上次登录时间 过期
if(lastLoginDate == null){
return expiration.before(new Date());
}else{
return issueDate.before(lastLoginDate);
}
}
拦截器里的判断
Claims claims = jwtUtils.getClaimByToken(token);
if(claims == null ){
Result result = ResultGenerator.genFailResult(ResultCode.UNAUTHORIZED,"token无效,请重新登录");
SendMsgUtil.sendJsonMessage(response,result);
return false;
}else{
User user = UserUtils.getUserByToken(token);
if(jwtUtils.isTokenExpired(claims.getExpiration(),user.getLoginDate(),claims.getIssuedAt())){
Result result = ResultGenerator.genFailResult(ResultCode.UNAUTHORIZED,"token失效,请重新登录");
SendMsgUtil.sendJsonMessage(response,result);
return false;
}
}
经过本人实际测试应用,挺好用的>_<