利用数据库,存放一个token过期的时间字段 private LocalDateTime expireTime;
在创建token时,标注上创建的时间 .setIssuedAt(new Date())。
如果这个创建时间小于 (修改密码、重置密码、退出登录)操作的更新时间expireTime,就表示它是修改或者登出之前的token,为过期token
token创建时间>数据库中的token过期时间 === 抛出异常 token失效
1.设置token的创建时间
2.方法拿到该token的创建时间
/**
* token创建时间
* @param token
* @return
*/
public Date getCreateTime(String token){
return getTokenBody(token).getIssuedAt();
}
3.用户进行 修改密码、重置密码、退出登录 的操作时 修改数据库中过期的时间字段 expireTime
4.在JWT拦截器中 拿到该用户的信息后 拿到该用户 修改密码、重置密码、退出登录的时间,然后与 该token的生成时间做比较,
如果该token生成的时间 在用户修改时间之前 则抛出去异常 。
到此旧的token就失效了 重新登录的时候 会生产新的token 新token的创建时间也会更新 拦截器到这里的时候
这个创建时间肯定是在 更新时间之后的 自然就放行了
Date createTime = jwtUtils.getCreateTime(authToken); //token的生成时间
LocalDateTime updateTime = jwtUserDto.getUserEntity().getExpireTime();//修改密码/重置密码/退出登录 的时间
LocalDateTime createDate = createTime.toInstant().atOffset(ZoneOffset.ofHours(8)).toLocalDateTime();
if (null != updateTime) {
if (createDate.isBefore(updateTime)) {
throw new AccountExpiredException("token已经失效,请重新登录!");
}
}