Java中过滤器和拦截器的区别有哪些
作者:伯恩bourne
前言
在 Spring Boot 中,过滤器(Filter)和拦截器(Interceptor)都用于处理请求和响应,但它们在实现机制、作用范围和使用场景上有明显区别,主要体现在以下几个方面:
1.技术本质不同
过滤器(Filter)
是 Java Servlet 规范定义的组件,属于 Servlet 容器层面的技术,不依赖 Spring 框架。
基于函数回调实现,工作在 Web 容器的请求处理链最外层,可以拦截所有进入容器的请求(包括静态资源、JSP 等)。拦截器(Interceptor)
是 Spring 框架自身定义的组件,依赖 Spring 容器,属于 Spring MVC 层面的技术。
基于 Java 反射(AOP 思想)实现,仅能拦截 Spring MVC 处理的请求(即通过DispatcherServlet
分发的请求)。
2.执行时机不同
请求处理流程中,两者的执行顺序如下:请求进入容器 → Filter 拦截 → DispatcherServlet 分发 → Interceptor 拦截 → Controller 处理 → Interceptor 后置处理 → Filter 后置处理 → 响应返回
- Filter:在请求到达
DispatcherServlet
之前执行,且在响应返回客户端前最后执行。 - Interceptor:在
DispatcherServlet
之后、Controller 之前执行,且在 Controller 处理完成后、视图渲染前后还有对应的回调方法。
3.拦截范围不同
- Filter:可拦截所有请求(如
.html
、.css
、.js
等静态资源,以及非 Spring MVC 处理的请求)。 - Interceptor:仅拦截 Spring MVC 管理的请求(即通过
@Controller
或@RestController
定义的接口),对静态资源、直接访问的 JSP 等不生效。
4.注入能力不同
- Filter:由 Servlet 容器管理生命周期,默认情况下无法直接注入 Spring 容器中的 Bean(需通过特殊配置才能获取 Spring 上下文)。
- Interceptor:由 Spring 容器管理,可直接注入 Spring 中的 Bean(如 Service、Repository 等),便于使用 Spring 的功能。
5.方法回调不同
- Filter:核心方法是
doFilter(ServletRequest, ServletResponse, FilterChain)
,通过FilterChain.doFilter()
放行请求,仅有请求前和响应后两个处理时机。 - Interceptor:提供三个核心方法:
preHandle()
:Controller 执行前调用(返回true
放行,false
拦截)。postHandle()
:Controller 执行后、视图渲染前调用。afterCompletion()
:视图渲染完成后、响应返回前调用(无论是否异常都会执行)。
6.使用场景不同
Filter:适合处理与 Servlet 容器相关的通用逻辑,如:
- 编码转换(如统一设置
UTF-8
)。 - 跨域请求处理(CORS 配置)。
- 敏感字符过滤、请求日志记录(包括静态资源)。
- 身份验证(如基于 Session 的登录校验)。
- 编码转换(如统一设置
Interceptor:适合处理与 Spring MVC 相关的业务逻辑,如:
- 权限精细校验(结合 Spring Security 或自定义权限逻辑)。
- 业务日志记录(仅针对接口请求)。
- 接口性能监控(记录请求处理时间)。
- 事务管理相关的预处理/后处理。
书中的关于过滤器和拦截器的区别?
(1)使用范围不同:Filter是Servlet规范规定的,只能用于web程序中。而拦截器既可以用于web程序,也可以用于Application、swing程序中。
(2)规范不同:Filter是在servlet规范中定义的,是Servlet容器支持的,而拦截器是在spring容器内的,是spring框架支持的。
(3)使用的资源不同:同其他的代码块一样,拦截器也是一个spring的组件,归spring管理,配置在spring文件中,因此能使用spring里的任何资源,独享。例如service对象、数据源、事务管理等,通过IOC注入到拦截器即可;而Filter不能。
(4)深度不同:Filter只在Servlet前后起作用。而拦截器能深入到方法前后、异常抛出前后等。因此拦截器的使用灵活性更大。所以在Spring为基础的构架的程序中,优先使用拦截器。
总结
- 过滤器是 Servlet 级别的“全局拦截”,适合处理容器层面的通用逻辑,不依赖 Spring。
- 拦截器是 Spring MVC 级别的“业务拦截”,适合处理与 Spring 集成的业务逻辑,功能更灵活。
实际开发中,两者可配合使用(如 Filter 处理编码和跨域,Interceptor 处理接口权限)。
到此这篇关于Java中过滤器和拦截器的区别有哪些的文章就介绍到这了,更多相关Java过滤器和拦截器区别内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!