转载

JWTToken超时刷新策略

原文链接:https://blog.csdn.net/qq394829044/article/details/82763936

对于登录的用户签发其对应的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;
   }

 

文章最后发布于: 2019-10-05 12:22:36
展开阅读全文
0 个人打赏
私信求帮助

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 1024 设计师: 上身试试

分享到微信朋友圈

×

扫一扫,手机浏览