欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

如何使JWT失效

程序员文章站 2024-03-20 20:04:46
...

关于使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