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
  • 通过WebMvcConfigureraddInterceptors方法注册
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处理业务相关的拦截逻辑。

相关推荐
3***g2054 分钟前
如何使用Spring Boot框架整合Redis:超详细案例教程
spring boot·redis·后端
狂奔小菜鸡19 分钟前
Day18 | 深入理解Object类
java·后端·java ee
jiayong2319 分钟前
Maven NUL文件问题 - 解决方案实施报告
java·maven
未秃头的程序猿21 分钟前
🔒 从单机到分布式:三大锁机制深度剖析与实战指南
java·后端
大猫子的技术日记23 分钟前
[百题重刷]前缀和 + Hash 表:缓存思想, 消除重复计算
java·缓存·哈希算法
得物技术31 分钟前
# 一、项目概览 Dragonboat 是纯 Go 实现的(multi-group)Raft 库。 为应用屏蔽 Raft 复杂性,提供易于使用的 NodeH
后端
4***149035 分钟前
Rust系统工具开发实践指南
开发语言·后端·rust
s***353039 分钟前
Spring Boot3.x集成Flowable7.x(一)Spring Boot集成与设计、部署、发起、完成简单流程
java·spring boot·后端
大头an39 分钟前
Spring Boot CLI 从入门到企业级实战(上下篇)
后端
3***161040 分钟前
【监控】Spring Boot+Prometheus+Grafana实现可视化监控
spring boot·grafana·prometheus