Java的Filter与Spring的Interceptor的比较


一、技术规范与框架依赖

维度 Filter Interceptor
所属规范 Servlet 规范(Java EE 标准组件) Spring MVC 框架组件(非 Java EE 标准)
框架依赖 不依赖 Spring,仅需 Servlet 容器(如 Tomcat) 依赖 Spring MVC 框架,需 Spring 容器管理
应用层级 Servlet 容器层(处理 HTTP 请求的底层入口) Spring MVC 层(位于 DispatcherServlet 处理流程中)

二、作用范围与拦截能力

维度 Filter Interceptor
拦截范围 拦截所有 HTTP 请求(包括静态资源、非 Spring 管理的请求) 仅拦截 Spring MVC 请求(无法拦截静态资源或非 Spring Controller 的请求)
数据访问 仅操作 ServletRequest/ServletResponse 可访问 HandlerMethodModelAndView 等 Spring 上下文对象
典型场景 全局字符编码、跨域处理、安全防护(XSS/SQL 注入) 业务级权限校验、日志记录、请求参数预处理

三、生命周期与执行顺序

维度 Filter Interceptor
生命周期 由 Servlet 容器管理,随 Web 应用启动初始化,销毁于应用关闭 由 Spring 容器管理,依赖 Spring 上下文生命周期
执行顺序 在 DispatcherServlet 处理前执行,按 web.xml@WebFilter 声明顺序 在 DispatcherServlet 处理后执行,按 Spring 注册顺序(可通过 @Order 调整)
方法触发时机 init()doFilter()destroy() preHandle()postHandle()afterCompletion()

四、功能特性与扩展能力

维度 Filter Interceptor
依赖注入 默认不支持,需通过 FilterRegistrationBean 或手动获取 Spring Bean 天然支持 Spring 依赖注入(如 @Autowired
异常处理 抛出异常无法被 Spring 全局异常处理器捕获(需自行处理或重定向) 可通过 @ControllerAdvice 统一处理异常
扩展灵活性 功能通用性强,适合底层操作(如请求/响应流修改) 与 Spring 生态深度集成,支持动态配置和业务逻辑扩展

五、配置方式与代码示例

  1. Filter 配置
    • 原生 Servlet 配置(web.xml):
xml 复制代码
<filter>
  <filter-name>EncodingFilter</filter-name>
  <filter-class>com.example.EncodingFilter</filter-class>
</filter>
<filter-mapping>
  <filter-name>EncodingFilter</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>

• Spring Boot 配置(FilterRegistrationBean):

java 复制代码
@Bean
public FilterRegistrationBean<EncodingFilter> encodingFilter() {
    FilterRegistrationBean<EncodingFilter> bean = new FilterRegistrationBean<>();
    bean.setFilter(new EncodingFilter());
    bean.addUrlPatterns("/*");
    return bean;
}
  1. Interceptor 配置
    • Spring MVC 配置(WebMvcConfigurer):
java 复制代码
@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new AuthInterceptor())
                .addPathPatterns("/api/**")
                .excludePathPatterns("/api/login");
    }
}

六、选型建议与最佳实践

场景 推荐技术 理由
全局请求处理(如字符编码) Filter 拦截所有请求,不依赖 Spring,性能开销低
业务逻辑拦截(如权限校验) Interceptor 可访问 Spring 上下文,支持细粒度路径控制
静态资源处理(如图片缓存) Filter 能拦截静态资源,适合缓存控制或防盗链
响应数据后处理(如日志记录) Interceptor 利用 postHandle 修改响应内容,结合 ModelAndView

总结

• Filter 核心优势:底层通用性强、拦截范围广、适合与 Servlet API 直接交互的场景。

• Interceptor 核心优势:与 Spring 生态无缝集成、支持精细化业务拦截、可操作 Spring 上下文。

根据需求选择,两者亦可组合使用(如 Filter 处理编码 → Interceptor 处理权限)。


spring中的Interceptor使用说明
java中的Filter使用详解

相关推荐
qq_185198693 小时前
(Spring Bean + delegateExpression)实现http服务 的完整可运行项目
spring
小Ti客栈4 小时前
Spring Boot 集成 Springdoc-OpenAPI 与 Knife4j实现接口文档与可视化调试
java·spring boot·后端
互联网中的一颗神经元4 小时前
小白python入门 - 39. 采集流水线小项目
开发语言·python
Wang's Blog4 小时前
Go-Zero 项目开发22:用户群聊功能的实现与完善
开发语言·golang
Ai拆代码的曹操4 小时前
Spring 事务 REQUIRES_NEW 嵌套调用:连接池翻倍的秘密
java·后端·spring
a1117765 小时前
坦克大战3D Three.js 3D (开源项目)
开发语言·javascript·3d
动恰客流统计5 小时前
ReID边缘计算视觉统计:餐饮店客流增长的数字化破局路径
java·大数据·运维·人工智能
Ivanqhz6 小时前
Rust &‘static str浅析
java·前端·javascript·rust
Wang's Blog6 小时前
Go-Zero项目开发24: 基于Bitmap实现群聊消息已读未读
开发语言·后端·golang
weixin_419658318 小时前
Docker 搭建 Jenkins 服务
java·docker·jenkins