java jwt刷新_jwt刷新token

本文介绍了两种JWT刷新机制:在线刷新和免密登录。在线刷新在每次访问资源时检查并刷新token;免密登录则使用refToken来刷新token,refToken的有效期长于普通token。详细阐述了代码实现和测试结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前一段时间讲过了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=newHashMap();

map.put("token", token);returnResult.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=newHashMap();

map.put("token", token);

map.put("refToken", refToken);returnResult.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:

aee59d06360ada91347fe9f9ef4e1ed2.png

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

31a664402695661b6e0b31e4a2866670.png

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

33c9156753592a33a2cb1a55d4cfa35c.png

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

2c2c4ace5109cd889f8e44075a028d83.png

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值