Spring Boot中Filter与Interceptor的区别

Spring Boot中Filter与Interceptor的区别

Filter和Interceptor都是Spring Boot中用于处理HTTP请求的组件,但它们在实现机制、使用场景和功能上有显著区别:

1. 所属规范与层级

  • Filter (过滤器)

  • 属于Servlet规范的一部分

  • 工作在Servlet容器层面

  • 在请求进入Servlet之前和响应离开Servlet之后执行

  • Interceptor (拦截器)

  • 属于Spring MVC框架的组件

  • 工作在Spring MVC框架层面

  • 在DispatcherServlet处理请求的过程中执行

2. 执行顺序

典型请求处理流程:

复制代码
HTTP请求 → Filter → DispatcherServlet → Interceptor → Controller → Interceptor → Filter → HTTP响应

3. 配置方式

  • Filter
  • 通过@WebFilter注解或FilterRegistrationBean注册
  • 需要实现javax.servlet.Filter接口
java 复制代码
@WebFilter(urlPatterns = "/*")
public class MyFilter implements Filter {
// 实现方法
}

或

java 复制代码
@Bean
public FilterRegistrationBean<MyFilter> myFilter() {
FilterRegistrationBean<MyFilter> bean = new FilterRegistrationBean<>();
bean.setFilter(new MyFilter());
bean.addUrlPatterns("/*");
return bean;
}
  • Interceptor
  • 实现HandlerInterceptor接口或继承HandlerInterceptorAdapter
  • 通过WebMvcConfigurer的addInterceptors方法注册
java 复制代码
public class MyInterceptor implements HandlerInterceptor {
// 实现方法
}

@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**");
}
}

4. 功能差异

  • Filter

  • 可以修改请求和响应对象

  • 更底层,可以处理所有请求(包括静态资源)

  • 无法直接访问Spring上下文和Bean

  • 适合做:编码设置、跨域处理、全局日志、权限验证(粗粒度)

  • Interceptor

  • 可以访问HandlerMethod和ModelAndView等Spring MVC对象

  • 只能拦截Controller请求(不处理静态资源)

  • 可以访问Spring上下文和Bean

  • 适合做:权限验证(细粒度)、日志记录、参数预处理等

5. 使用场景建议

  • 使用Filter的场景:

  • 需要处理所有请求(包括静态资源)

  • 需要修改请求或响应对象(如包装Request/Response)

  • 与Servlet容器相关的功能(如字符编码)

  • 使用Interceptor的场景:

  • 需要与Spring MVC深度集成

  • 需要访问Handler方法或Controller

  • 需要基于Spring的依赖注入

  • 需要细粒度的权限控制

6. 性能考虑

Filter通常比Interceptor更高效,因为它在更早的阶段执行且不涉及Spring MVC的处理流程。但对于需要Spring上下文的功能,Interceptor是更好的选择。

在实际项目中,两者经常结合使用,Filter处理底层通用逻辑,Interceptor处理业务相关的拦截逻辑。

相关推荐
现任明教教主~2 小时前
SpringBoot+Vue学生宿舍管理系统源码 带部署文档
vue.js·spring boot·后端
panxianren7 小时前
Bun 1.4 的 bun test --parallel 将 4 秒的测试套件缩短到约 1 秒
java·javascript
码事漫谈8 小时前
骂AI,会让它做得更好吗?
后端
sunshine22 girl9 小时前
Java学习七 Java 项目实战2-注册业务
java·学习
萧瑟余晖9 小时前
Spring Boot 核心理念与快速上手
spring boot
陈随易9 小时前
bm2,Node.js 与 Bun 项目部署新选择
前端·后端·程序员
省钱兄--zs9 小时前
北京24小时自助健身房系统软件开发实战:从架构设计到部署指南
java·数据仓库·spring boot·小程序·需求分析
youdexiang9 小时前
Android录音软件时间关键词检索功能分析
java·人工智能
架构技术专栏10 小时前
AI Agent 框架怎么选:从一次制度查询拆出技术边界
后端·面试
sunshine22 girl10 小时前
Java学习七 Java 项目实战1-项目创建和主页面搭建
java·开发语言·学习