【黑马点评-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();

posted @ 2025-04-12 16:21  kuki'  阅读(66)  评论(0)    收藏  举报