JWTToken超时刷新策略
生活随笔
收集整理的這篇文章主要介紹了
JWTToken超时刷新策略
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
對于登錄的用戶簽發其對應的jwt,我們在jwt設置他的固定有效期時間,在有效期內用戶攜帶jwt訪問沒問題,當過有效期后jwt失效,用戶需要重新登錄獲取新的jwt。這個體驗不太好,好的體驗應該是:活躍的用戶應該在無感知的情況下在jwt失效后獲取到新的jwt,攜帶這個新的jwt進行訪問,而長時間不活躍的用戶應該在jwt失效后需要進行重新的登錄認證。
這里就涉及到了token的超時刷新問題,解決方案看圖:
?
?
/*** JWTToken刷新生命周期* 1、登錄成功后將用戶的JWT生成的Token作為k、v存儲到cache緩存里面(這時候k、v值一樣)* 2、當該用戶在次請求時,通過JWTFilter層層校驗之后會進入到doGetAuthenticationInfo進行身份驗證* 3、當該用戶這次請求JWTToken值還在生命周期內,則會通過重新PUT的方式k、v都為Token值,緩存中的token值生命周期時間重新計算(這時候k、v值一樣)* 4、當該用戶這次請求jwt生成的token值已經超時,但該token對應cache中的k還是存在,則表示該用戶一直在操作只是JWT的token失效了,程序會給token對應的k映射的v值重新生成JWTToken并覆蓋v值,該緩存生命周期重新計算* 5、當該用戶這次請求jwt在生成的token值已經超時,并在cache中不存在對應的k,則表示該用戶賬戶空閑超時,返回用戶信息已失效,請重新登錄。* 6、每次當返回為true情況下,都會給Response的Header中設置Authorization,該Authorization映射的v為cache對應的v值。* 7、注:當前端接收到Response的Header中的Authorization值會存儲起來,作為以后請求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;}?
總結
以上是生活随笔為你收集整理的JWTToken超时刷新策略的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: nyoj-754--黑心医生
- 下一篇: hdu-超级密码(BFS)