基于springboot+jwt實(shí)現(xiàn)刷新token過(guò)程解析
前一段時(shí)間講過(guò)了springboot+jwt的整合,但是因?yàn)橐恍┰颍▊€(gè)人比較懶)并沒(méi)有更新關(guān)于token的刷新問(wèn)題,今天跟別人閑聊,聊到了關(guān)于業(yè)務(wù)中token的刷新方式,所以在這里我把我知道的一些點(diǎn)記錄一下,也希望能幫到一些有需要的朋友,同時(shí)也希望給我一些建議,話不多說(shuō),上代碼!
1:這種方式為在線刷新,比方說(shuō)設(shè)定的token有效期為30min,那么每次訪問(wèn)資源時(shí),都會(huì)在攔截器中去判斷一下token是否過(guò)期,如果沒(méi)有過(guò)期就刷新token的時(shí)間為30min,反之則會(huì)重新登錄,需要注意的是這種方式我是在登錄以后就將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.這種方式為免密登錄,也就是說(shuō),登錄一次后就不用再通過(guò)賬號(hào)密碼登錄,思路就是在生成token時(shí)候,在生成一個(gè)refToken來(lái)刷新,比如說(shuō)我的token設(shè)置的有效期為5分鐘,refToken設(shè)置的為一周,那么在請(qǐng)求時(shí)候則判斷token是否過(guò)期,如果已經(jīng)過(guò)期 就判斷refToken的時(shí)間有沒(méi)有過(guò)期,沒(méi)有過(guò)期則生成一個(gè)新的token給前端,同時(shí)重置這個(gè)refToken(看你自己),如果refToken已經(jīng)過(guò)期則重新登錄,需要注意的是這次生成的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);
//這里在攔截其中校驗(yàn)token,如果校驗(yàn)失敗,則判斷redis的refToken是否過(guò)期
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中的測(cè)試結(jié)果:
這里是登錄后返回的token和refToken:

這里是登陸成功之后的顯示:

這里是token過(guò)期后,refToken刷新的token:

這里是設(shè)定的refToken過(guò)期后在訪問(wèn)的顯示:

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Spring AOP使用@Aspect注解 面向切面實(shí)現(xiàn)日志橫切的操作
這篇文章主要介紹了Spring AOP使用@Aspect注解 面向切面實(shí)現(xiàn)日志橫切的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06
Java樹(shù)形結(jié)構(gòu)數(shù)據(jù)生成導(dǎo)出excel文件方法記錄
最近好像得罪了poi,遇到的都是導(dǎo)出word、Excel、pdf的問(wèn)題,下面這篇文章主要給大家介紹了關(guān)于Java樹(shù)形結(jié)構(gòu)數(shù)據(jù)生成導(dǎo)出excel文件的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2021-10-10
Java實(shí)現(xiàn)上傳和下載功能(支持多個(gè)文件同時(shí)上傳)
這篇文章主要介紹了Java實(shí)現(xiàn)上傳和下載功能,支持多個(gè)文件同時(shí)上傳,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-12-12
SpringBoot集成netty實(shí)現(xiàn)websocket通信功能
Netty是一個(gè)高性能、異步事件驅(qū)動(dòng)的網(wǎng)絡(luò)應(yīng)用框架,用于快速開(kāi)發(fā)可維護(hù)的高性能協(xié)議服務(wù)器和客戶端,WebSocket 是一種網(wǎng)絡(luò)通信協(xié)議,相比傳統(tǒng)的HTTP協(xié)議,本文給大家介紹了SpringBoot集成netty實(shí)現(xiàn)websocket通信功能,需要的朋友可以參考下2024-03-03
SpringMVC Restful api接口實(shí)現(xiàn)的代碼
本篇文章主要介紹了SpringMVC Restful api接口實(shí)現(xiàn)的代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-09-09
screw?Maven插件方式運(yùn)行時(shí)在編譯打包時(shí)跳過(guò)執(zhí)行的問(wèn)題解決方法
這篇文章主要介紹了screw?Maven插件方式運(yùn)行時(shí)在編譯打包時(shí)跳過(guò)執(zhí)行的問(wèn)題解決方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-03-03
Java Swing組件單選框JRadioButton用法示例
這篇文章主要介紹了Java Swing組件單選框JRadioButton用法,結(jié)合具體實(shí)例形式分析了Swing單選框JRadioButton的使用方法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下2017-11-11

