使用redis加锁实现,拿到锁的线程进行token刷新,拿不到锁的线程跳过token刷新
具体实现
/**
* 刷新AccessToken
*/
private boolean refreshToken(String uid,String account, ServletResponse response) {
Boolean lock = JedisUtil.getLock(account);//获取锁
if(lock){
String newToken = JwtUtil.getToken(uid, account);//获取更新token
// 设置响应的Header头新Token
HttpServletResponse httpServletResponse = (HttpServletResponse) response;
// 最后将刷新的AccessToken存放在Response的Header中的Authorization字段返回
httpServletResponse.setHeader(Constant.REQUEST_AUTH_HEADER, newToken);
httpServletResponse.setHeader("Access-Control-Expose-Headers", Constant.REQUEST_AUTH_HEADER);
}
return true;
}
/**
* 是否更新token(redis锁实现)
* @param lockName 锁后缀
* @return 是否更新token
*/
public static Boolean getLock(String lockName) {
String key = Constant.redis_lock_token_perfix + lockName;
try {
boolean isExist = exists(key);
if(!isExist){
setObject(key,"0",Constant.redis_lock_token_expire);//上锁,设置超时时间(应小于token刷新时间),自动释放锁
logger.info("获取redis锁:"+key+"---成功");
return Boolean.TRUE;
}
logger.error("获取redis锁:"+key+"---失败");
} catch (Exception e) {
logger.error("获取redis锁:"+key+"---失败", e);
}
return Boolean.FALSE;
}
测试结果