【前端转全栈java速通课】 项目实战④12-14节 拦截器过滤器和全局配置-cors跨域设置-token体系-利用session做验证码

拦截器、过滤器与全局配置

在 Spring Boot 项目中,拦截器(Interceptor)、过滤器(Filter)与全局配置共同构成了请求处理链路中的关键环节。合理使用它们,可以在不侵入业务代码的前提下完成登录校验、日志记录、跨域处理、参数清洗等通用逻辑。

1. 过滤器(Filter)

过滤器是 Servlet 规范中的组件,作用于请求进入 Servlet 之前与响应返回之后,适合处理与协议层相关的通用逻辑。

java 复制代码
@Component
public class RequestLogFilter implements Filter {

    private static final Logger log = LoggerFactory.getLogger(RequestLogFilter.class);

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        long start = System.currentTimeMillis();
        chain.doFilter(request, response);
        long cost = System.currentTimeMillis() - start;
        log.info("请求处理耗时:{} ms", cost);
    }
}

2. 拦截器(Interceptor)

拦截器是 Spring MVC 提供的组件,作用于 Controller 方法调用前后,可以拿到 HandlerMethod,适合做权限校验、参数校验、接口幂等等业务级逻辑。

java 复制代码
@Component
public class AuthInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
        String token = request.getHeader("Authorization");
        if (token == null || token.isEmpty()) {
            response.setStatus(HttpStatus.UNAUTHORIZED.value());
            return false;
        }
        // 这里可以解析 token、校验用户身份
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
                           ModelAndView modelAndView) throws Exception {
        // 请求处理完成后、视图渲染前执行
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,
                                Exception ex) throws Exception {
        // 整个请求结束后执行,适合释放资源、记录日志
    }
}

3. 全局配置类

通过实现 WebMvcConfigurer,可以统一注册拦截器、配置跨域、静态资源映射等。

java 复制代码
@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Resource
    private AuthInterceptor authInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(authInterceptor)
                .addPathPatterns("/api/**")
                .excludePathPatterns("/api/login", "/api/register");
    }

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowedOriginPatterns("*")
                .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")
                .allowedHeaders("*")
                .allowCredentials(true)
                .maxAge(3600);
    }
}

4. 过滤器与拦截器的区别

对比项 过滤器(Filter) 拦截器(Interceptor)
规范来源 Servlet 规范 Spring MVC 规范
作用范围 所有请求,包括静态资源 仅作用于 Controller 方法
依赖容器 依赖 Servlet 容器 依赖 Spring 容器,可注入 Bean
执行时机 请求进入 Servlet 之前 Controller 方法调用前后
典型场景 编码处理、跨域、日志 登录校验、权限控制、幂等校验

5. 全局异常处理

配合 @RestControllerAdvice 可以统一处理业务异常,避免在每个 Controller 中重复编写 try-catch。

java 复制代码
@RestControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(BusinessException.class)
    public ResponseEntity<Result<Void>> handleBusinessException(BusinessException e) {
        return ResponseEntity.ok(Result.fail(e.getCode(), e.getMessage()));
    }

    @ExceptionHandler(Exception.class)
    public ResponseEntity<Result<Void>> handleException(Exception e) {
        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
                .body(Result.fail(500, "系统繁忙,请稍后重试"));
    }
}

通过以上组合,可以在项目中形成「过滤器做协议层处理 → 拦截器做业务层校验 → 全局异常处理兜底」的完整请求链路,让业务代码保持简洁、职责清晰。

6. CORS 跨域设置

前后端分离架构下,前端与后端往往部署在不同域名或端口,浏览器会触发跨域请求。Spring Boot 提供了多种方式配置 CORS(Cross-Origin Resource Sharing),下面介绍几种常用方案。

6.1 全局配置类方式

在 WebConfig 中重写 addCorsMappings 方法,统一配置跨域规则,适合全局生效的场景。

java 复制代码
@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowedOriginPatterns("http://localhost:8080", "https://example.com")
                .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")
                .allowedHeaders("*")
                .allowCredentials(true)
                .maxAge(3600);
    }
}

6.2 注解方式

在具体的 Controller 或方法上使用 @CrossOrigin 注解,适合局部开启跨域的场景。

java 复制代码
@RestController
@RequestMapping("/api/user")
@CrossOrigin(origins = "http://localhost:8080", maxAge = 3600)
public class UserController {

    @GetMapping("/info")
    public Result<UserInfo> getUserInfo() {
        // 业务逻辑
        return Result.success(userInfo);
    }
}

6.3 过滤器方式

通过自定义 Filter 手动设置响应头,适合需要精细控制响应头的场景。

java 复制代码
@Component
public class CorsFilter implements Filter {

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        HttpServletResponse res = (HttpServletResponse) response;
        res.setHeader("Access-Control-Allow-Origin", "*");
        res.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
        res.setHeader("Access-Control-Allow-Headers", "*");
        res.setHeader("Access-Control-Max-Age", "3600");
        if ("OPTIONS".equalsIgnoreCase(((HttpServletRequest) request).getMethod())) {
            res.setStatus(HttpServletResponse.SC_OK);
            return;
        }
        chain.doFilter(request, response);
    }
}

6.4 配置注意事项

  • allowedOriginPatterns 支持通配符,如 "*" 表示允许所有来源;但开启 allowCredentials(true) 时,"*" 通配符会被浏览器拒绝,需明确指定来源。
  • OPTIONS 预检请求需要被正确处理,否则跨域请求会失败。
  • 生产环境建议将 allowedOriginPatterns 限定为实际的前端域名,避免安全风险。
  • 若同时配置了过滤器与拦截器,需注意 CORS 响应头在过滤器阶段就要写入,否则拦截器校验可能拿不到跨域信息。

通过以上方式,可以灵活地为项目配置 CORS 跨域策略,满足前后端分离开发与部署的需求。

相关推荐
瑞克-桑切斯8 分钟前
7、MySQL 慢查询排查与优化实战指南
java·服务器·数据库
西索斯coding18 分钟前
gemini-3.1-flash-image 报 400 怎么办?图片能打开为何仍是 INVALID_ARGUMENT?
ai
benchmark_cc31 分钟前
A 股、港股、美股如何建立统一的标的主数据格式?
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash
七牛云行业应用1 小时前
DeepSeek Super-agent 与 Grok Bot:开源 Agent 架构和聊天助手有何区别
人工智能·ai·架构·ai编程
Csvn1 小时前
性能监控
前端
Zenova EdgeOS2 小时前
Go 工业边缘错误处理实战:用 errors 构建可追溯错误链
开发语言·数据库·golang
Csvn2 小时前
构建工具
前端
取名真是2 小时前
Python 算法知识点从基础到进阶
开发语言·python·算法
FRing032 小时前
vue2干货总结3(computed计算属性、watch监听器)
开发语言·前端·vue.js·vue2
七牛云行业应用3 小时前
MIT “权重空间编程”:GPT-6 Astra 修改 0.016% 的 Qwen 权重,MATH-500 从 7.9% 升至 48.1%
人工智能·gpt·ai