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

相关推荐
石榴树下的七彩鱼1 小时前
图片修复 API 接入实战:网站如何自动去除图片水印(Python / PHP / C# 示例)
图像处理·后端·python·c#·php·api·图片去水印
我叫黑大帅1 小时前
为什么TCP是三次握手?
后端·网络协议·面试
我叫黑大帅1 小时前
如何排查 MySQL 慢查询
后端·sql·面试
techdashen1 小时前
Rust项目公开征测:Cargo 构建目录新布局方案
开发语言·后端·rust
一 乐1 小时前
电影院|基于springboot + vue电影院购票管理系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·论文·毕设·电影院购票管理管理系统
恼书:-(空寄1 小时前
JVM GC 日志分析 + 常见 GC 场景 + 实战参数调优
java·jvm
消失的旧时光-19431 小时前
Spring Boot 实战(五):接口工程化升级(统一返回 + 异常处理 + 错误码体系 + 异常流转机制)
java·spring boot·后端·解耦
Rust研习社2 小时前
Rust 智能指针 Cell 与 RefCell 的内部可变性
开发语言·后端·rust
夕颜1112 小时前
Skill 机器人 vs Hermes Agent:两种「AI 越用越聪明」的路径
后端
杨凯凡3 小时前
【012】图与最短路径:了解即可
java·数据结构