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,表示未授权。