Java中过滤器,拦截器,AOP之间的区别以及分别执行的时机
一. 概念
1. 过滤器(Filter) 是Java Servlet规范的一部分,主要处理HTTP请求和响应。它们是在请求进入Servlet容器之后,但还没到达Servlet之前执行的,或者在响应返回给客户端之前进行后处理。比如,过滤器的典型应用是日志记录、权限验证、字符编码设置等。记得过滤器可以配置在web.xml里或者使用注解,作用于所有的请求资源,比如Servlet、JSP、静态资源等。
2. 拦截器(Interceptor) 通常和Spring MVC相关。拦截器是在DispatcherServlet处理请求的过程中,对Controller的请求进行拦截。它们可以在处理请求的前后、渲染视图前后以及整个请求完成后执行。拦截器依赖于Spring框架,主要用于更细粒度的控制,比如日志、权限检查、参数预处理等。需要实现HandlerInterceptor接口,并配置在Spring的上下文中,所以它们只对Controller的请求有效,静态资源可能不会被拦截。
3. AOP(面向切面编程) 是Spring框架的一个功能,通过动态代理在方法调用前后插入代码。AOP不直接与Web请求关联,而是关注业务逻辑的横切关注点,比如事务管理、日志、性能监控等。它基于切面(Aspect)、切入点(Pointcut)、通知(Advice)等概念,可以在方法调用前、后、抛出异常时等时机执行。AOP的应用范围更广,不局限于Web层,可以作用于Service层、DAO层等任何Spring管理的Bean。
二. 区别分析
-
归属不同:Filter属于Servlet规范,Interceptor是Spring MVC的,AOP是Spring的。
-
作用范围:Filter最广,影响所有资源;Interceptor只针对Controller;AOP作用于方法级别,任何Spring Bean。
-
执行时机: Filter在Servlet前后,Interceptor在Controller方法前后,而AOP在方法调用前后。
-
实现方式: Filter需要配置在web.xml或使用注解,Interceptor实现Spring接口并配置,AOP则用注解或XML配置切面。
-
依赖方面: Filter不依赖Spring,Interceptor和AOP需要Spring环境。
核心区别对比:
三. 执行时机与流程
1. 过滤器(Filter)
执行时机: 在请求进入 Servlet 容器(如 Tomcat)之后,但在请求到达 Servlet 之前;响应返回客户端之前。
执行顺序: FilterChain 按配置顺序执行。
伪代码流程:
// 请求阶段
Filter1 -> Filter2 -> ... -> Servlet.service()
// 响应阶段
Servlet.service() -> Filter2 -> Filter1 -> 客户端
2. 拦截器(Interceptor)
执行时机: 在 Spring MVC 的 DispatcherServlet 处理请求时,围绕 Controller 方法调用。
关键方法:
-
preHandle():Controller 方法执行前。
-
postHandle():Controller 方法执行后,视图渲染前。
-
afterCompletion():视图渲染后(请求完成时)。
伪代码流程:
Interceptor1.preHandle()
-> Interceptor2.preHandle()
-> Controller 方法
-> Interceptor2.postHandle()
-> Interceptor1.postHandle()
-> 渲染视图
-> Interceptor2.afterCompletion()
-> Interceptor1.afterCompletion()
3. AOP(AOP)
执行时机: 围绕方法调用(不限于 Web 层),通过动态代理实现。
通知类型:
-
@Before:方法执行前。
-
@AfterReturning:方法正常返回后。
-
@AfterThrowing:方法抛出异常后。
-
@After:方法结束后(无论是否异常)。
-
@Around:包裹整个方法执行。
@Around 开始
-> @Before
-> 目标方法执行
-> @AfterReturning(正常) 或 @AfterThrowing(异常)
-> @After
-> @Around 结束
四. 执行顺序对比(完整请求生命周期):
客户端请求
│
▼
Servlet 容器
│
▼
Filter1 → Filter2 → ... → FilterN
│
▼
DispatcherServlet
│
▼
Interceptor1.preHandle() → Interceptor2.preHandle()
│
▼
Controller 方法
│
▼
AOP 的 @Around/@Before → 目标方法 → AOP 的 @AfterReturning/@AfterThrowing
│
▼
Interceptor2.postHandle() ← Interceptor1.postHandle()
│
▼
视图渲染(如 Thymeleaf/JSP)
│
▼
Interceptor2.afterCompletion() ← Interceptor1.afterCompletion()
│
▼
FilterN → ... → Filter2 → Filter1
│
▼
客户端响应
五. 适用场景:
过滤器(Filter)
-
全局请求/响应处理(如设置字符编码 CharacterEncodingFilter)。
-
安全过滤(如 XSSFilter 防止跨站脚本攻击)。
-
日志记录请求耗时。
拦截器(Interceptor)
-
验证用户登录状态(如 LoginInterceptor)。
-
预处理/后处理 Controller 参数(如参数解密)。
-
记录 Controller 方法的执行时间。
AOP
-
事务管理(@Transactional)。
-
统一日志记录(如 Service 层方法调用日志)。
-
权限校验(通过自定义注解实现方法级权限控制)。
六. 总结
-
过滤器是 Servlet 层级的粗粒度控制,适合处理所有请求的通用逻辑。
-
拦截器是 Spring MVC 层级的细粒度控制,适合针对 Controller 的定制逻辑。
-
AOP是方法层级的灵活切面,适合解耦业务无关的横切关注点(如日志、事务)。