过滤器和拦截器的区别

ps:如果这篇帖子对于还在找工作和找实习的你有所帮助,可以关注我,给本贴点赞、评论、收藏并订阅专栏;同时不要吝啬您的花花

过滤器(Filter)和拦截器(Interceptor)是Java Web开发中常用的请求增强组件,二者都能实现请求预处理、响应后处理的逻辑,但底层归属、执行层级、依赖环境、作用范围存在本质差异,适用场景也截然不同。简单来说:过滤器是Web容器层面的原生组件,拦截器是Spring框架层面的业务组件,二者处于请求处理的不同链路节点。

一、核心定义与底层归属

1.1 过滤器(Filter)

过滤器是Servlet规范(JSR-315)定义的原生Web组件,属于Java EE标准,不依赖任何第三方框架,由Tomcat、Jetty等Web容器直接加载和管理。它的核心作用是对进入容器的所有请求、响应做全局过滤,提前拦截无效请求、统一设置参数,是容器级别的横切逻辑。

实现方式:自定义类实现javax.servlet.Filter接口,重写init()、doFilter()、destroy()三个核心方法,其中doFilter()是核心过滤逻辑。

1.2 拦截器(Interceptor)

拦截器是Spring MVC框架专属的扩展组件,基于Spring AOP思想实现,属于应用层框架组件,必须依赖Spring容器运行,脱离Spring环境无法生效。它的核心作用是对Spring MVC的Controller请求做精细化拦截,聚焦业务层的逻辑增强,是框架级别的横切逻辑。

实现方式:自定义类实现HandlerInterceptor接口,重写preHandle()、postHandle()、afterCompletion()三个方法,分别对应请求执行前、Controller执行后、视图渲染后三个节点。

二、核心维度全方位对比

规范归属

Servlet原生规范,Java EE标准,通用型组件

Spring MVC框架专属,Spring生态扩展,非通用标准

依赖环境

仅依赖Web容器(Tomcat/Jetty),无需Spring

必须依赖Spring容器,脱离Spring无法运行

执行时机

请求进入Web容器后、进入Servlet/DispatcherServlet前执行;响应返回客户端前执行

请求进入DispatcherServlet后、Controller方法执行前后执行;视图渲染完成后执行

作用范围

拦截Web容器所有请求,包括静态资源(HTML/CSS/JS/图片)、动态Servlet请求

仅拦截Spring MVC映射的Controller动态请求,无法拦截静态资源

拦截粒度

粗粒度,只能针对URL路径做拦截,无法精细到Controller方法、参数

细粒度,可针对Controller、请求方法、请求参数做精细化拦截,支持Spring容器资源调用

依赖注入

无法直接使用Spring的依赖注入,需手动获取Bean

由Spring容器管理,可直接注入Service、Dao等Spring Bean

生命周期

随Web容器启动初始化,容器关闭销毁,生命周期由容器管控

随Spring容器启动初始化,容器关闭销毁,生命周期由Spring管控

异常处理

无法捕获Controller层的业务异常,仅能处理容器级异常

可捕获Controller层的业务异常,配合Spring全局异常处理实现统一管控

配置方式

web.xml配置、注解@WebFilter、FilterRegistrationBean注册

实现HandlerInterceptor+注册到WebMvcConfigurer,注解+配置类绑定

三、请求执行流程差异

客户端发起HTTP请求后,执行链路严格遵循过滤器先执行,拦截器后执行的顺序,完整流程如下:

  1. 客户端请求到达Web容器,过滤器doFilter()前置逻辑执行,过滤请求头、参数、路径;
  2. 请求放行后进入DispatcherServlet(Spring MVC核心分发器);
  3. 拦截器preHandle()执行,做业务校验(登录、权限),校验通过则进入Controller;
  4. Controller方法执行业务逻辑,返回ModelAndView;
  5. 拦截器postHandle()执行,处理响应数据、修改视图参数;
  6. 视图渲染完成,拦截器afterCompletion()执行,做资源清理;
  7. 响应返回Web容器,过滤器doFilter()后置逻辑执行,处理响应头、编码;
  8. 响应返回客户端,流程结束。

四、实战场景选型建议

4.1 优先使用过滤器的场景

  • 全局字符编码设置、跨域请求处理(CORS)、请求头统一修改;
  • 静态资源拦截、恶意请求过滤、IP黑名单拦截;
  • 非Spring项目、纯Servlet项目的请求增强;
  • 需要对所有Web请求(含静态资源)做全局处理的场景。

4.2 优先使用拦截器的场景

  • 用户登录校验、接口权限控制、会话管理;
  • Controller层日志打印、接口性能监控、参数校验;
  • 需要调用Spring Bean(Service/Redis工具类)的业务逻辑;
  • 针对特定Controller、接口路径的精细化拦截。

核心总结:过滤器管「容器全局」,拦截器管「Spring业务」;粗粒度全局过滤用Filter,细粒度业务增强用Interceptor,二者可配合使用实现完整的请求管控链路。

ps:如果这篇帖子对于还在找工作和找实习的你有所帮助,可以关注我,给本贴点赞、评论、收藏并订阅专栏;同时不要吝啬您的花花

Spring 文章被收录于专栏

本专栏聚焦Spring全生态体系,从IoC/AOP核心原理入手,覆盖Spring Boot自动配置、事务管理、Web开发等实战内容。拆解循环依赖、动态代理等高频面试难点,助力开发者从入门到精通,打通单体到微服务的技术链路,解决企业级开发痛点,提升架构设计与问题排查能力,成为Java后端进阶的必备技术专栏。

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务