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处理业务相关的拦截逻辑。