guyue
7 天以前 1b6b900d88e109e5d1fe7a89d4c087148db4fd9d
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
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;
    }
}