JWTToken超時刷新策略

參考地址:https://blog.csdn.net/qq394829044/article/details/82763936

背景:項目使用的shiro+jwt來做整套權限加請求安全驗證,但是jwt的token自己沒有超時刷新機制,所以這裏簡單貼出解決方案。解決方案使用Cache做緩存(使用redis也可以,效果相同)。


 /**
     * 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;
   }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章