基于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过期后在访问的显示:

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

相关文章

  • Spring AOP使用@Aspect注解 面向切面实现日志横切的操作

    Spring AOP使用@Aspect注解 面向切面实现日志横切的操作

    这篇文章主要介绍了Spring AOP使用@Aspect注解 面向切面实现日志横切的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • Java树形结构数据生成导出excel文件方法记录

    Java树形结构数据生成导出excel文件方法记录

    最近好像得罪了poi,遇到的都是导出word、Excel、pdf的问题,下面这篇文章主要给大家介绍了关于Java树形结构数据生成导出excel文件的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2021-10-10
  • Java实现上传和下载功能(支持多个文件同时上传)

    Java实现上传和下载功能(支持多个文件同时上传)

    这篇文章主要介绍了Java实现上传和下载功能,支持多个文件同时上传,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-12-12
  • SpringBoot集成netty实现websocket通信功能

    SpringBoot集成netty实现websocket通信功能

    Netty是一个高性能、异步事件驱动的网络应用框架,用于快速开发可维护的高性能协议服务器和客户端,WebSocket 是一种网络通信协议,相比传统的HTTP协议,本文给大家介绍了SpringBoot集成netty实现websocket通信功能,需要的朋友可以参考下
    2024-03-03
  • SpringMVC Restful api接口实现的代码

    SpringMVC Restful api接口实现的代码

    本篇文章主要介绍了SpringMVC Restful api接口实现的代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-09-09
  • maven如何使用profiles多环境配置

    maven如何使用profiles多环境配置

    在软件开发过程中,我们经常需要在不同的环境中部署和运行我们的应用程序,例如开发环境、测试环境和生产环境,为了方便管理和配置不同环境下的参数,我们可以使用Maven的profiles功能,本文给大家介绍maven如何使用profiles多环境配置,感兴趣的的朋友一起看看吧
    2024-02-02
  • screw Maven插件方式运行时在编译打包时跳过执行的问题解决方法

    screw Maven插件方式运行时在编译打包时跳过执行的问题解决方法

    这篇文章主要介绍了screw Maven插件方式运行时在编译打包时跳过执行的问题解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-03-03
  • Java Swing组件单选框JRadioButton用法示例

    Java Swing组件单选框JRadioButton用法示例

    这篇文章主要介绍了Java Swing组件单选框JRadioButton用法,结合具体实例形式分析了Swing单选框JRadioButton的使用方法及相关操作注意事项,需要的朋友可以参考下
    2017-11-11
  • Springboot连接和操作mongoDB方式

    Springboot连接和操作mongoDB方式

    这篇文章主要介绍了Springboot连接和操作mongoDB方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • SpringBoot热部署配置方法详解

    SpringBoot热部署配置方法详解

    在实际开发中,每次修改代码就需要重启项目,重新部署,对于一个后端开发者来说,重启确实很难受。在java开发领域,热部署一直是一个难以解决的问题,目前java虚拟机只能实现方法体的热部署,对于整个类的结构修改,仍然需要重启项目
    2022-11-11

最新评论