java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > SpringMvc Interceptor,Filter

SpringMvc(Interceptor,Filter)实现方案

作者:清风徐来QCQ

在JavaWeb开发中,过滤器和拦截器都是用于实现AOP的工具,但它们在框架层级和执行时机上有所不同,过滤器属于Servlet规范,位于所有Servlet之前,可以对所有请求进行预处理,本文给大家介绍SpringMvc(Interceptor,Filter)实现方案,感兴趣的朋友一起看看吧

在 Java Web 开发中,过滤器 (Filter)拦截器 (Interceptor) 都是常用的 AOP(面向切面编程)实现方式,但它们所属的框架层级和执行时机有很大不同。

我们可以把它们想象成进入大楼的保安(过滤器)和进入办公室前的秘书(拦截器)

1. 过滤器 (Filter)

过滤器属于 Servlet 规范,它位于所有 Servlet 之前。它可以对几乎所有的请求(HTML、图片、JS、路径等)进行预处理。

实现方案一:通过@WebFilter注解(Servlet 原生)

这是最简单、最直接的方式,不需要额外的配置类。

实现方案二:通过FilterRegistrationBean(Spring Boot统一管理生命周期 推荐)

如果你需要更精细地控制过滤器的执行顺序(Order),或者你的过滤器是第三方库提供的,这种方案最合适。

@Bean
public FilterRegistrationBean<MyFilter> registrationBean() {
    FilterRegistrationBean<MyFilter> bean = new FilterRegistrationBean<>();
    bean.setFilter(new MyFilter()); // 设置过滤器
    bean.addUrlPatterns("/api/*");  // 设置拦截路径
    bean.setOrder(1);               // 设置优先级,数字越小越靠前
    return bean;
}

2. 拦截器 (Interceptor)

拦截器属于 Spring MVC 框架。它只能拦截发送到 Controller 的请求。因为它在 Spring 容器中,所以它可以直接使用 Spring 注入的对象(比如 Service)。

需要继承/实现的类

注册拦截器

实现拦截器后,必须将其注册到 Spring MVC 的配置中:

3. 核心区别对比表

特性过滤器 (Filter)拦截器 (Interceptor)
所属框架Servlet 容器 (如 Tomcat)Spring MVC 框架
实现接口jakarta.servlet.FilterHandlerInterceptor
拦截范围几乎所有请求 (URL 匹配即可)仅针对 Controller 的请求
注入能力较难直接注入 Spring Bean完美支持注入 Bean
执行时机在 Servlet 之前执行在 Servlet 之后,Controller 之前执行
主要用途编码设置、敏感词过滤、全局压缩权限检查、日志记录、参数预处理

简单总结:

为什么跨域请求要通过过滤器实现?

其实跨域(CORS)既可以通过**过滤器(Filter)实现,也可以通过拦截器(Interceptor)**或者 Spring 提供的 @CrossOrigin 注解实现。

但在实际生产中,绝大多数架构师会首选过滤器。这主要源于跨域请求的一个特殊机制:预检请求(Preflight Request)

1. 预检请求(OPTIONS)的拦路虎

当浏览器发现你在发起一个“复杂请求”(比如带了自定义 Header 或 Content-Type 为 application/json)时,它会先自动发送一个 OPTIONS 方法的探测请求。

2. 为什么选择过滤器的三大理由

① 执行时机最早(最核心原因)

跨域配置本质上是给 HTTP 响应头加上 Access-Control-Allow-Origin 等字段。

② 解决权限框架(Security/Shiro)的冲突

如果你的项目中使用了 Spring Security,它本身就是通过一系列过滤器实现的。

③ 覆盖范围广

过滤器是针对 URL 模式拦截的。如果你的项目里既有 Spring MVC 的 Controller,又有一些原生的 Servlet,或者静态资源,过滤器可以一把抓,统一处理所有资源的跨域问题。

3. 实现代码对比

过滤器方案(推荐)

这种方式利用 Spring 提供的 CorsFilter,通常配合 FilterRegistrationBean 使用,优先级设为最高。

@Bean
public FilterRegistrationBean<CorsFilter> corsFilter() {
    UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
    CorsConfiguration config = new CorsConfiguration();
    config.setAllowCredentials(true);
    config.addAllowedOriginPattern("*"); // 允许所有来源
    config.addAllowedHeader("*");        // 允许所有Header
    config.addAllowedMethod("*");        // 允许所有方法
    source.registerCorsConfiguration("/**", config);
    FilterRegistrationBean<CorsFilter> bean = new FilterRegistrationBean<>(new CorsFilter(source));
    bean.setOrder(Ordered.HIGHEST_PRECEDENCE); // 确保在最前端执行
    return bean;
}

总结

跨域选择过滤器,是因为它能在业务逻辑和安全框架之前处理 OPTIONS 请求。就像在大楼的**正门口(过滤器)贴上“欢迎光临”的告示,比等客人进了办公室(拦截器)**才说欢迎要高效且稳妥得多。

到此这篇关于SpringMvc(Interceptor,Filter)实现方案的文章就介绍到这了,更多相关SpringMvc Interceptor,Filter内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文