当前位置: 首页 > news >正文

Spring 拦截器(Interceptor)与过滤器(Filter)对比

Spring 拦截器(Interceptor)与过滤器(Filter)对比


核心对比表格
对比维度拦截器(Interceptor)过滤器(Filter)
定义Spring MVC 提供的组件,集成于 Spring 处理器链。Servlet 规范组件,属于 Java EE 标准。
作用范围仅限于映射到 Controller 的请求(如 @RequestMapping 处理的请求)。所有请求(包括静态资源、非 Spring 处理的请求)。
执行时机Spring MVC 处理器链中执行(Controller 方法前后)。Servlet 容器启动时初始化,请求到达时立即执行(在 Spring MVC 处理器链之前)。
生命周期由 Spring 容器管理(默认单例),无显式 init()destroy() 方法。由 Servlet 容器管理,需实现 init()destroy() 方法。
核心方法preHandle(), postHandle(), afterCompletion()init(), doFilter(), destroy()
配置方式通过 WebMvcConfigurer.addInterceptors() 注册。通过 FilterRegistrationBeanweb.xml 注册。
典型使用场景权限验证、日志记录、请求参数校验、与 Spring 服务层交互。跨域处理(CORS)、日志记录、请求压缩、静态资源拦截、通用 HTTP 头处理。
依赖注入支持支持 @Autowired 等 Spring 依赖注入。需通过 FilterRegistrationBean@Component 显式注入。
执行顺序控制通过 order() 方法设置优先级(数值越小优先级越高)。通过 FilterRegistrationBean.setOrder()web.xml 的声明顺序控制。
异常处理通过 afterCompletion() 处理异常(需配合 HandlerExceptionResolver)。需在 doFilter() 中通过 try-catch 捕获异常。
性能影响仅针对 Controller 请求,性能影响较小。针对所有请求,可能影响性能(如频繁的静态资源请求)。

关键区别示例
场景 1:身份验证
  • 拦截器:适合与 Spring 服务层结合,如通过 @Autowired 注入 UserService 验证 Token。
  • 过滤器:适合通用 Token 验证(如 JWT),拦截所有请求(包括登录接口)。
场景 2:日志记录
  • 拦截器:记录 Controller 方法级别的执行时间。
  • 过滤器:记录所有请求的 URL、响应时间(包括静态资源)。
场景 3:异常处理
  • 拦截器:通过 afterCompletion() 统计接口错误率。
  • 过滤器:需在 doFilter() 中通过 try-catch 处理异常。

代码示例对比
拦截器配置
@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new AuthInterceptor())
                .order(1)
                .addPathPatterns("/**")
                .excludePathPatterns("/login");
    }
}
过滤器配置
@Configuration
public class FilterConfig {
    @Bean
    public FilterRegistrationBean<CorsFilter> corsFilterRegistration() {
        FilterRegistrationBean<CorsFilter> registration = new FilterRegistrationBean<>();
        registration.setFilter(new CorsFilter());
        registration.addUrlPatterns("/*");
        registration.setOrder(2);
        return registration;
    }
}

生命周期对比
阶段拦截器(Interceptor)过滤器(Filter)
初始化由 Spring 容器自动初始化,无 init() 方法。需实现 init() 方法,在 Servlet 容器启动时调用。
请求处理preHandle() → Controller → postHandle()afterCompletion()doFilter() 中处理请求(需显式调用 chain.doFilter())。
销毁由 Spring 容器管理,无 destroy() 方法。需实现 destroy() 方法,在应用关闭时调用。

执行流程图
客户端请求 →
├─ Filter 的 doFilter() →
│  ├─ Filter 前置处理 →
│  │  └─ 继续 FilterChain →
│  │     ├─ Interceptor 的 preHandle() →
│  │     │  └─ 拦截器前置处理 →
│  │     │     └─ Controller 方法执行 →
│  │     │        └─ Interceptor 的 postHandle() →
│  │     │           └─ 拦截器后置处理 →
│  │     └─ Interceptor 的 afterCompletion() →
│  │        └─ 拦截器完成处理
│  └─ Filter 后置处理
└─ 响应返回

选择建议
  1. 使用拦截器的场景

    • 需要与 Spring 上下文深度集成(如依赖注入服务层)。
    • 仅需处理 Controller 映射的请求(如 /api/**)。
    • 需要细粒度控制请求生命周期(如方法执行前后校验)。
  2. 使用过滤器的场景

    • 需要拦截所有请求(包括静态资源、非 Spring 处理的请求)。
    • 需要直接操作请求/响应对象(如修改 HTTP 头、压缩响应)。
    • 需要在请求到达 Spring 处理器链之前执行逻辑(如统一日志记录)。

总结
  • 拦截器Spring MVC 的高级组件,适合与 Spring 生态深度集成,处理 Controller 层的业务逻辑。
  • 过滤器Servlet 规范的底层组件,适合通用请求处理(如跨域、日志),作用范围更广但灵活性较低。

两者可以 同时使用,形成更复杂的处理链(例如:过滤器处理跨域,拦截器处理权限验证)。

相关文章:

  • 51c深度学习~合集4
  • 【学Rust写CAD】16 零标记类型(zero.rs)
  • linux scp复制多层级文件夹到另一服务器免密及脚本配置
  • 数据库基础(聚合函数 分组 排序)
  • 大型语言模型的秘密:思考链长度与提示格式的魔力
  • mmaction2的mmcv依赖安装教程
  • 探究 CSS 如何在HTML中工作
  • 马拉车算法
  • 存储管理(一)
  • Flutter Autocomplete 从入门到进阶:打造智能输入体验的完整指南
  • 远程连接电脑
  • week2|机器学习(吴恩达)学习笔记
  • 微服务间通信
  • 畅捷通T+与吉客云数据集成案例解析
  • 直流分量的产生以及危害,THD总谐波失真度的定义,有哪些危害
  • 蓝桥杯 子2023
  • 博卡软件管理中心8:为美容美发行业量身打造的轻量级管理方案
  • ch05 课堂参考代码
  • Selenium Web自动化如何快速又准确的定位元素路径,强调一遍是元素路径
  • 【C#】Task 线程停止
  • 长沙做企业网站的公司/泉州百度关键词排名
  • 网站建设对于学校的重要性/google seo 优化招聘
  • 中国建设银行报网站/seo是搜索引擎营销吗
  • 蚂蚁建站/班级优化大师官方网站
  • 婚恋交友网站模板/百度百科词条入口
  • 动态网站建设 教学大纲/自己怎么做网址开网站