过滤器(Filter)和拦截器(Interceptor)都是 Java Web 开发中用于处理请求和响应的组件,但它们在技术归属、作用范围、执行时机等方面有显著区别。以下是具体对比:
1. 技术归属不同
过滤器(Filter)
属于 Servlet 规范,是 Java EE 标准的一部分,由 Servlet 容器(如 Tomcat)管理。
依赖于 Servlet 容器,无法脱离 Servlet 环境使用。拦截器(Interceptor)
属于 Spring 框架,是 Spring MVC 的一部分,由 Spring 容器管理。
依赖于 Spring 环境,通常用于 Spring MVC 或 Spring Boot 项目中。
2. 作用范围不同
过滤器
可拦截所有请求(包括静态资源如 HTML、CSS、JS,以及非 Spring MVC 处理的请求),只要在web.xml
或注解中配置了拦截路径,就会生效。
例如:拦截/api/*
路径下的所有请求,无论是否由 Controller 处理。拦截器
仅拦截Spring MVC 处理的请求(即通过@Controller
或@RestController
定义的接口),对静态资源或非 Spring 管理的请求无效。
例如:只能拦截 Controller 中的@GetMapping
、@PostMapping
等方法。
3. 执行时机与生命周期不同
过滤器的执行时机
在 Servlet 容器接收请求后,进入 Spring MVC 之前执行,且在响应返回给客户端前也会执行。
生命周期由 Servlet 容器控制:init()
(初始化)→doFilter()
(处理请求)→destroy()
(销毁)。核心方法
doFilter()
接收ServletRequest
、ServletResponse
和FilterChain
参数,通过chain.doFilter()
放行请求。拦截器的执行时机
在 Spring MVC 的 DispatcherServlet 接收请求后,调用 Controller 方法前后执行,更贴近业务逻辑层。
生命周期由 Spring 容器管理,提供 3 个核心方法:preHandle()
:Controller 方法执行前调用(返回true
放行,false
拦截)。postHandle()
:Controller 方法执行后、视图渲染前调用。afterCompletion()
:视图渲染完成后、响应返回前调用(通常用于资源清理)。
4. 功能权限不同
过滤器
可修改 ServletRequest、ServletResponse 的内容(如设置编码、修改参数),甚至可以完全替换请求或响应对象。
但无法直接访问 Spring 容器中的 Bean(如需访问,需通过WebApplicationContextUtils
间接获取)。拦截器
可访问 Spring MVC 的核心对象(如HandlerMethod
、ModelAndView
),能直接获取 Controller 方法的参数、注解等信息。
可直接注入 Spring 容器中的 Bean(如 Service、Dao),便于调用业务逻辑。
5. 典型应用场景
过滤器适用场景
- 全局编码处理(如设置
UTF-8
字符集)。 - 静态资源访问控制(如限制未登录用户访问 JS/CSS)。
- 请求参数过滤(如防 XSS 攻击、敏感词过滤)。
- 日志记录(记录所有请求的 URL、IP 等)。
- 全局编码处理(如设置
拦截器适用场景
- 权限验证(如检查用户是否登录、是否有操作权限)。
- 业务逻辑增强(如 Controller 方法执行前后添加日志、计时)。
- 事务管理(如 Controller 方法执行异常时回滚事务)。
- 缓存控制(如对特定接口返回结果进行缓存)。
执行顺序对比(一次请求的完整流程)
- 客户端发送请求到 Servlet 容器(Tomcat)。
- 过滤器(Filter) 执行
doFilter()
方法(请求进入时)。 - 请求进入 Spring MVC 的 DispatcherServlet。
- 拦截器(Interceptor) 执行
preHandle()
方法(Controller 执行前)。 - Controller 方法执行。
- 拦截器执行
postHandle()
方法(Controller 执行后,视图渲染前)。 - 视图渲染(如 Thymeleaf、JSP 解析)。
- 拦截器执行
afterCompletion()
方法(视图渲染后)。 - 过滤器执行
doFilter()
方法中chain.doFilter()
之后的逻辑(响应返回前)。 - 响应返回给客户端。
总结
对比维度 | 过滤器(Filter) | 拦截器(Interceptor) |
---|---|---|
技术归属 | Servlet 规范(Java EE) | Spring 框架(Spring MVC) |
作用范围 | 所有请求(含静态资源) | 仅 Spring MVC 处理的请求 |
执行时机 | Servlet 容器层面(早于 MVC) | Spring MVC 层面(Controller 前后) |
依赖环境 | 依赖 Servlet 容器 | 依赖 Spring 容器 |
访问权限 | 可修改请求 / 响应,难访问 Spring Bean | 可访问 Controller 信息,易注入 Spring Bean |
实际开发中,过滤器更适合处理底层通用逻辑(如编码、全局过滤),拦截器更适合处理业务相关逻辑(如权限、日志),二者可配合使用。