package com.linghu.utils;
|
|
import org.springframework.web.servlet.HandlerInterceptor;
|
import javax.servlet.http.HttpServletRequest;
|
import javax.servlet.http.HttpServletResponse;
|
|
public class TokenInterceptor implements HandlerInterceptor {
|
private final OpenCryptUtil openCryptUtil;
|
|
public TokenInterceptor(OpenCryptUtil openCryptUtil) {
|
this.openCryptUtil = openCryptUtil;
|
}
|
|
// 预处理:控制器方法执行前调用
|
@Override
|
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
|
// 1. 跳过OPTIONS请求(可选,因为CORS已处理,这里只是双重保险)
|
if ("OPTIONS".equalsIgnoreCase(request.getMethod())) {
|
return true; // 放行OPTIONS请求
|
}
|
|
// 2. 提取并验证Token(逻辑同之前的过滤器)
|
String token = extractToken(request);
|
if (token == null || !validateToken(token)) {
|
response.setStatus(HttpServletResponse.SC_OK);
|
response.setContentType("application/json;charset=UTF-8");
|
response.getWriter().write("{\"code\": 401, \"message\": \"无效的token\"}");
|
return false; // 拦截无效Token请求
|
}
|
|
// 3. Token有效,放行请求到控制器
|
return true;
|
}
|
|
// 提取Token(同过滤器逻辑)
|
private String extractToken(HttpServletRequest request) {
|
String authHeader = request.getHeader("Authorization");
|
return authHeader; // 注意:实际应判断是否以"Bearer "开头并截取
|
}
|
|
// 验证Token(同过滤器逻辑)
|
private boolean validateToken(String token) {
|
if (token == null || token.isEmpty()) {
|
return false;
|
}
|
String decrypted = openCryptUtil.decrypt(token);
|
return decrypted != null;
|
}
|
}
|