JWTToken超时刷新策略
生活随笔
收集整理的這篇文章主要介紹了
JWTToken超时刷新策略
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
對(duì)于登錄的用戶簽發(fā)其對(duì)應(yīng)的jwt,我們?cè)趈wt設(shè)置他的固定有效期時(shí)間,在有效期內(nèi)用戶攜帶jwt訪問沒問題,當(dāng)過有效期后jwt失效,用戶需要重新登錄獲取新的jwt。這個(gè)體驗(yàn)不太好,好的體驗(yàn)應(yīng)該是:活躍的用戶應(yīng)該在無感知的情況下在jwt失效后獲取到新的jwt,攜帶這個(gè)新的jwt進(jìn)行訪問,而長時(shí)間不活躍的用戶應(yīng)該在jwt失效后需要進(jìn)行重新的登錄認(rèn)證。
這里就涉及到了token的超時(shí)刷新問題,解決方案看圖:
?
?
/*** JWTToken刷新生命周期* 1、登錄成功后將用戶的JWT生成的Token作為k、v存儲(chǔ)到cache緩存里面(這時(shí)候k、v值一樣)* 2、當(dāng)該用戶在次請(qǐng)求時(shí),通過JWTFilter層層校驗(yàn)之后會(huì)進(jìn)入到doGetAuthenticationInfo進(jìn)行身份驗(yàn)證* 3、當(dāng)該用戶這次請(qǐng)求JWTToken值還在生命周期內(nèi),則會(huì)通過重新PUT的方式k、v都為Token值,緩存中的token值生命周期時(shí)間重新計(jì)算(這時(shí)候k、v值一樣)* 4、當(dāng)該用戶這次請(qǐng)求jwt生成的token值已經(jīng)超時(shí),但該token對(duì)應(yīng)cache中的k還是存在,則表示該用戶一直在操作只是JWT的token失效了,程序會(huì)給token對(duì)應(yīng)的k映射的v值重新生成JWTToken并覆蓋v值,該緩存生命周期重新計(jì)算* 5、當(dāng)該用戶這次請(qǐng)求jwt在生成的token值已經(jīng)超時(shí),并在cache中不存在對(duì)應(yīng)的k,則表示該用戶賬戶空閑超時(shí),返回用戶信息已失效,請(qǐng)重新登錄。* 6、每次當(dāng)返回為true情況下,都會(huì)給Response的Header中設(shè)置Authorization,該Authorization映射的v為cache對(duì)應(yīng)的v值。* 7、注:當(dāng)前端接收到Response的Header中的Authorization值會(huì)存儲(chǔ)起來,作為以后請(qǐng)求token使用* @param userName* @param passWord* @return*/public boolean jwtTokenRefresh(String userName,String passWord){HttpServletRequest httpServletRequest = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();HttpServletResponse response = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getResponse();String token = httpServletRequest.getHeader(Constants.TOKEN);String cacheTokenKey = String.valueOf(EhcacheUtils.getInstance().get("matedataManagement", token));System.out.println(cacheTokenKey == null);if(!StringUtils.isEmpty(cacheTokenKey) && !cacheTokenKey.equals("null")){if (!JWTUtil.verify(token, userName, passWord)) {String newAuthorization=JWTUtil.sign(userName, passWord);EhcacheUtils.getInstance().put("matedataManagement", cacheTokenKey, newAuthorization, JWTUtil.getExpireTime()/1000);}else {EhcacheUtils.getInstance().put("matedataManagement", cacheTokenKey, cacheTokenKey,JWTUtil.getExpireTime()/1000);}response.setHeader("Authorization", String.valueOf(EhcacheUtils.getInstance().get("matedataManagement", cacheTokenKey)));return true;} return false;}?
總結(jié)
以上是生活随笔為你收集整理的JWTToken超时刷新策略的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: nyoj-754--黑心医生
- 下一篇: hdu-超级密码(BFS)