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