基于springboot+jwt实现刷新token过程解析

 更新时间:2020年03月27日 09:09:12   作者:一步一高  
这篇文章主要介绍了基于springboot+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过期后在访问的显示:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • 解析Java并发Exchanger的使用

    解析Java并发Exchanger的使用

    Exchanger是java 5引入的并发类,Exchanger顾名思义就是用来做交换的。这里主要是两个线程之间交换持有的对象。当Exchanger在一个线程中调用exchange方法之后,会等待另外的线程调用同样的exchange方法。两个线程都调用exchange方法之后,传入的参数就会交换。
    2021-06-06
  • Java获取手机号码归属地的实现

    Java获取手机号码归属地的实现

    这篇文章主要介绍了Java获取手机号码归属地的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-12-12
  • JavaWeb基于Session实现的用户登陆注销方法示例

    JavaWeb基于Session实现的用户登陆注销方法示例

    为了安全起见,session常常用来保存用户的登录信息。那么服务器是怎么来实现的呢?下面这篇文章就来给大家介绍了关于JavaWeb基于Session实现的用户登陆注销的相关资料,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧。
    2017-12-12
  • spring security数据库表结构实例代码

    spring security数据库表结构实例代码

    这篇文章主要介绍了spring security数据库表结构实例代码,需要的朋友可以参考下
    2017-09-09
  • java获取本地文件的多种方式实现与比较

    java获取本地文件的多种方式实现与比较

    这篇文章主要为大家详细介绍了java获取本地文件的多种方式实现与结果比较,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-11-11
  • SpringBoot事务使用及回滚实现代码详解

    SpringBoot事务使用及回滚实现代码详解

    这篇文章主要介绍了SpringBoot事务使用及回滚实现代码详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-08-08
  • 实例解读Ajax与servlet交互的方法

    实例解读Ajax与servlet交互的方法

    这篇文章主要介绍了Ajax与servlet交互的方法,需要的朋友可以参考下
    2014-07-07
  • 深入了解Java接口回调机制

    深入了解Java接口回调机制

    这篇文章主要介绍了Java接口回调机制,下面我们来一起学习一下吧
    2019-05-05
  • 如何将文件流转换成byte[]数组

    如何将文件流转换成byte[]数组

    这篇文章主要介绍了如何将文件流转换成byte[]数组,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • java 格式化输出数字的方法

    java 格式化输出数字的方法

    在实际工作中,常常需要设定数字的输出格式,如以百分比的形式输出,或者设定小数位数等,现稍微总结如下
    2014-01-01

最新评论