【黑马点评-1登录验证】三、登录拦截器1 RefreshTokenInterceptor 用于刷新Redis中的token
逻辑步骤
preHandle()方法
1. 获取request中的token
String token = request.getHeader("authorization");
2. token非空,则基于token获取Redis(Hash数据结构)中的userMap即用户数据
- key为
"login:token:" + token
String key = RedisConstants.LOGIN_USER_KEY + token;
// 3. 基于token获取Redis中的用户数据
Map<Object, Object> userMap = stringRedisTemplate.opsForHash().entries(key);
- 得到userMap这个HashMap结构
3. userMap 这个Hash数据转为UserDto对象
使用hutool工具类的fillBeanWithMap方法,将userMap的value存到UserDTO的属性里
// 5. 将查询到的Hash数据转化为UserDto对象
UserDTO userDTO = BeanUtil.fillBeanWithMap(userMap, new UserDTO(), false);
4. 存到ThreadLocal中
// 6. 将用户信息保存到ThreadLocal
UserHolder.saveUser(userDTO);
UserHolder类(ThreadLocal相关)
public class UserHolder {
private static final ThreadLocal<UserDTO> tl = new ThreadLocal<>();
public static void saveUser(UserDTO user){
tl.set(user);
}
public static UserDTO getUser(){
return tl.get();
}
public static void removeUser(){
tl.remove();
}
}
5. 刷新token的过期时间
设置前面那个key"login:token:" + token过期时间
// 7. 刷新tokenTTL,这里的存活时间根据需要自己设置,这里的常量值我改为了30分钟
stringRedisTemplate.expire(key, RedisConstants.LOGIN_USER_TTL, TimeUnit.MINUTES);
afterCompletion
// 销毁ThreadLocal,避免内存泄漏
UserHolder.removeUser();

浙公网安备 33010602011771号