前一段时间讲过了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

最新文章

  1. 使用Maven+Nexus+Jenkins+Svn+Tomcat+Sonar搭建持续集成环境(二)
  2. [转] - Configuring Android Studio: IDE &amp; VM Options, JDK, etc
  3. 跟我学Windows Azure 五 使用Cloub Service连接Blob Service完成图片的上传
  4. Linux 之HTTP服务,APACHE
  5. QTabWidget 使用方法
  6. atitit. hb 原生sql跨数据库解决原理 获得hb 数据库类型运行期获得Dialect
  7. 每天一个linux命令(31):grep 命令
  8. dedecms首页调用栏目内容和单页内容的方法
  9. linux 下安装 搭建 svn服务器
  10. 【百度地图-安卓SDK】从头开始写android程序
  11. Servlet课程0426(十一)Servlet Cookie实现两周内不用重复登录
  12. _itoa_s, _i64toa_s, _ui64toa_s, _itow_s, _i64tow_s, _ui64tow_s
  13. JavaScript高级程序设计32.pdf
  14. 使用tcpdump抓Android网络包
  15. hcharts中文网 一个js图表库
  16. ashMap源码阅读与解析
  17. 自动化测试KPI考评的一种方法
  18. Webpack的基本配置
  19. redis缓存清除
  20. LeetCode算法题-Jewels and Stones(Java实现)

热门文章

  1. python实现发票二维码解析
  2. Svelte
  3. 容器 之搭建 jenkins ci 平台
  4. Lazarus 开发环境使用技巧
  5. Linux中启动Docker容器报错:Error response from daemon: driver failed programming external connectivity
  6. locust自定义负载策略。
  7. KETTLE 首次连DB2报错,无驱动。
  8. STP理论基础
  9. 2022-03-02 关于 react-native 如何使用 react-native-image-crop-picker
  10. OnMicro BLE应用方案|蓝牙语音遥控器-OM6621E