如何使JWT失效

关于使JWT失效问题

最近在弄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;
           }
        }
经过本人实际测试应用,挺好用的>_<
  • 8
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 21
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 21
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值