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

相关推荐
Slow菜鸟9 分钟前
SpringBoot集成Elasticsearch | Elasticsearch 8.x专属Java Client
java·spring boot·elasticsearch
Miraitowa_cheems11 分钟前
LeetCode算法日记 - Day 82: 环形子数组的最大和
java·数据结构·算法·leetcode·决策树·线性回归·深度优先
豐儀麟阁贵1 小时前
4.5数组排序算法
java·开发语言·数据结构·算法·排序算法
Halo_tjn1 小时前
Java Map集合
java·开发语言·计算机
程序猿小蒜2 小时前
基于springboot的车辆管理系统设计与实现
java·数据库·spring boot·后端·spring·oracle
90后的晨仔2 小时前
Java后端开发:从零构建企业级应用的完整架构与技术栈详解
后端
zl9798993 小时前
SpringBoot-Web开发之Web原生组件注入
java·spring boot·spring
小羊学伽瓦3 小时前
【Java数据结构】——常见力扣题综合
java·数据结构·leetcode·1024程序员节
I'm Jie3 小时前
(五)Gradle 依赖传递与冲突处理
java·spring boot·spring·kotlin·gradle·maven
我命由我123453 小时前
Spring Cloud - Spring Cloud 声明式接口调用(Fiegn 声明式接口调用概述、Fiegn 使用)
java·后端·spring·spring cloud·微服务·架构·java-ee