jwt刷新token
2024-09-08 17:02:05
前一段时间讲过了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
最新文章
- 使用Maven+Nexus+Jenkins+Svn+Tomcat+Sonar搭建持续集成环境(二)
- [转] - Configuring Android Studio: IDE &; VM Options, JDK, etc
- 跟我学Windows Azure 五 使用Cloub Service连接Blob Service完成图片的上传
- Linux 之HTTP服务,APACHE
- QTabWidget 使用方法
- atitit. hb 原生sql跨数据库解决原理 获得hb 数据库类型运行期获得Dialect
- 每天一个linux命令(31):grep 命令
- dedecms首页调用栏目内容和单页内容的方法
- linux 下安装 搭建 svn服务器
- 【百度地图-安卓SDK】从头开始写android程序
- Servlet课程0426(十一)Servlet Cookie实现两周内不用重复登录
- _itoa_s, _i64toa_s, _ui64toa_s, _itow_s, _i64tow_s, _ui64tow_s
- JavaScript高级程序设计32.pdf
- 使用tcpdump抓Android网络包
- hcharts中文网 一个js图表库
- ashMap源码阅读与解析
- 自动化测试KPI考评的一种方法
- Webpack的基本配置
- redis缓存清除
- LeetCode算法题-Jewels and Stones(Java实现)
热门文章
- python实现发票二维码解析
- Svelte
- 容器 之搭建 jenkins ci 平台
- Lazarus 开发环境使用技巧
- Linux中启动Docker容器报错:Error response from daemon: driver failed programming external connectivity
- locust自定义负载策略。
- KETTLE 首次连DB2报错,无驱动。
- STP理论基础
- 2022-03-02 关于 react-native 如何使用 react-native-image-crop-picker
- OnMicro BLE应用方案|蓝牙语音遥控器-OM6621E