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

相关推荐
SL_staff11 小时前
3天上线OKR系统:一名HR与1名工程师如何用JVS完成全栈交付
java·低代码·开源
IT_陈寒11 小时前
Java Stream处理大集合,我的内存怎么就炸了
前端·人工智能·后端
悟空码字12 小时前
四轮对话两张配图:用 WorkBuddy 优化公众号发文配图的实战指南
人工智能·后端·腾讯
ServBay12 小时前
xAI的 Grok Bot发布,AI 已经学会自己上班了
后端·ai编程·grok
分支预测失败12 小时前
RISC-V 多核缓存一致性机制解析:MESI 协议族、CMO 扩展与 Linux 同步原语
后端
n8n12 小时前
Spring AI 检索增强生成(RAG)实战:让模型掌握你的私有知识
后端
Nturmoils12 小时前
只备份一个 schema,别把整库都搬走
后端
妙码生花12 小时前
利用AI从零学Go并完成实战项目,完工总结:目录结构
前端·后端·go
妙码生花12 小时前
利用AI从零学Go并完成实战项目,完工总结:商业级开源产品定位和核心特性介绍
前端·后端·go
程序员cxuan12 小时前
GPT-6 Astra 的提示词泄露了,里面居然藏着个保安?
人工智能·后端·程序员