如何使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;
           }
        }
经过本人实际测试应用,挺好用的>_<

你可能感兴趣的:(jwt,jwt)