• jwt刷新token


    前一段时间讲过了springboot+jwt的整合,但是因为一些原因(个人比较懒)并没有更新关于token的刷新问题,今天跟别人闲聊,聊到了关于业务中token的刷新方式,所以在这里我把我知道的一些点记录一下,也希望能帮到一些有需要的朋友,同时也希望给我一些建议,话不多说,上代码!

    1:这种方式为在线刷新,比方说设定的token有效期为30min,那么每次访问资源时,都会在拦截器中去判断一下

    token是否过期,如果没有过期就刷新token的时间为30min,反之则会重新登录,需要注意的是这种方式我是在登

    录以后就将token存在了redis.

          //登录方法中将token存在redis
            String token = JwtUtil.sign(userName,user.getId());
            redisUtil.set(UserConstants.PREFIX_USER_TOKEN + token, token,UserConstants.TOKEN_EXPIRE_TIME);
            Map map=new HashMap();
            map.put("token", token);
            return Result.success(map);
    
    //在拦截器中获取token,并判断token的有效期 String token
    = req.getHeader(UserConstants.ACCESS_TOKEN); if (Strings.isNullOrEmpty(token)) { return false; } Object reqToken=redisUtil.get(UserConstants.PREFIX_USER_TOKEN+token); if (ObjectUtils.isEmpty(reqToken)) { return false; } if(redisUtil.getExpire(UserConstants.PREFIX_USER_TOKEN+token) <1){ return false; } redisUtil.set(UserConstants.PREFIX_USER_TOKEN + token, token,UserConstants.TOKEN_EXPIRE_TIME); return true;

    2.这种方式为免密登录,也就是说,登录一次后就不用再通过账号密码登录,思路就是在生成token时候,在生成一个refToken来刷新,比如说

    我的token设置的有效期为5分钟,refToken设置的为一周,那么在请求时候则判断token是否过期,如果已经过期 就判断refToken的时间

    有没有过期,没有过期则生成一个新的token给前端,同时重置这个refToken(看你自己),如果refToken已经过期则重新登录,需要注意的是这次生成的token并不存在redis中,而是将refToken存在redis。

            // 生成token
            String token = JwtUtil.sign(userName,user.getId());
            //刷新token,免密登陆
            String refToken=UUID.randomUUID().toString().replaceAll("-","");
            redisUtil.set(UserConstants.PREFIX_USER_TOKEN + token, refToken,UserConstants.TOKEN_EXPIRE_TIME);
            Map map=new HashMap();
            map.put("token", token);
            map.put("refToken", refToken);
            return Result.success(map);
    
           //这里在拦截其中校验token,如果校验失败,则判断redis的refToken是否过期
           if (!JwtUtil.verify(token)) {
                if(redisUtil.getExpire(UserConstants.PREFIX_USER_TOKEN+token)>=1){
                    HttpServletResponse httpServletResponse = (HttpServletResponse) response;
                    String newRefToken=UUID.randomUUID().toString().replaceAll("-","");
                    Integer userId=Integer.parseInt(JwtUtil.getUserId(token));
                    User user=userService.selectOne(userId);
                    String newToken=JwtUtil.sign(user.getUserName(),user.getId());
                    httpServletResponse.setHeader("newToken",newToken);
                    httpServletResponse.setHeader("newRefToken",newRefToken);
                    return true;
                }else{
                    return false;
                }
            }

    3.贴一下我在postMan中的测试结果:

    这里是登录后返回的token和refToken:

    这里是登陆成功之后的显示:

    这里是token过期后,refToken刷新的token:

    这里是设定的refToken过期后在访问的显示:

    参考链接:https://zhuanlan.zhihu.com/p/57608281

  • 相关阅读:
    Hive架构(数据库和表)?
    BUG管理工具的跟踪过程(用BugZilla为例子)
    shiro有哪些组件?
    接口绑定有几种实现方式,分别是怎么实现的?
    什么是 MyBatis 的接口绑定,有什么好处?
    MyBatis 的好处是什么?
    MyBatis 与 Hibernate 有哪些不同?
    什么是 MyBatis 的接口绑定,有什么好处?
    MyBatis 的好处是什么?
    MyBatis 与 Hibernate 有哪些不同?
  • 原文地址:https://www.cnblogs.com/red-star/p/12577077.html
Copyright © 2020-2023  润新知