參考地址: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;
}