LOADING

加载过慢请开启缓存 浏览器默认开启

redis做后端拦截器

LoginInterceptor 类

包路径

package com.itheima.interceptors;

类定义

@Component
public class LoginInterceptor implements HandlerInterceptor {
    @Autowired
    private StringRedisTemplate stringRedisTemplate;

预处理方法

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 令牌验证
        String token = request.getHeader("Authorization");
        // 验证 token
        try {
            // 从 Redis 中获取相同的 token
            ValueOperations<String, String> operations = stringRedisTemplate.opsForValue();
            String redisToken = operations.get(token);
            if (redisToken == null) {
                // token 已经失效了
                throw new RuntimeException();
            }
            Map<String, Object> claims = JwtUtil.parseToken(token);

            // 把业务数据存储到 ThreadLocal 中
            ThreadLocalUtil.set(claims);
            // 放行
            return true;
        } catch (Exception e) {
            // HTTP 响应状态码为 401
            response.setStatus(401);
            // 不放行
            return false;
        }
    }

完成后处理方法

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        // 清空 ThreadLocal 中的数据
        ThreadLocalUtil.remove();
    }
}

说明

  • 功能: LoginInterceptor 类是一个 Spring MVC 的拦截器,主要用于验证用户请求中的 JWT 令牌。
  • 依赖: 使用了 StringRedisTemplate 来从 Redis 中获取存储的令牌。
  • 方法:
    • preHandle: 在请求处理之前执行,验证请求中的 JWT 令牌,并将解析后的信息存储在 ThreadLocal 中。
    • afterCompletion: 在请求处理完成后执行,清空 ThreadLocal 中的数据,以避免内存泄漏。

错误处理

  • 如果令牌失效或验证失败,拦截器将返回 HTTP 状态码 401,表示未授权。