Java中过滤器,拦截器,AOP之间的区别以及分别执行的时机

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 容器
  │
  ▼
Filter1Filter2...FilterN
  │
  ▼
DispatcherServlet
  │
  ▼
Interceptor1.preHandle()Interceptor2.preHandle()
  │
  ▼
Controller 方法
  │
  ▼
AOP@Around/@Before → 目标方法 → AOP@AfterReturning/@AfterThrowing
  │
  ▼
Interceptor2.postHandle()Interceptor1.postHandle()
  │
  ▼
视图渲染(如 Thymeleaf/JSP)
  │
  ▼
Interceptor2.afterCompletion()Interceptor1.afterCompletion()
  │
  ▼
FilterN...Filter2Filter1
  │
  ▼
客户端响应


五. 适用场景:

过滤器(Filter)
  • 全局请求/响应处理(如设置字符编码 CharacterEncodingFilter)。

  • 安全过滤(如 XSSFilter 防止跨站脚本攻击)。

  • 日志记录请求耗时。

拦截器(Interceptor)
  • 验证用户登录状态(如 LoginInterceptor)。

  • 预处理/后处理 Controller 参数(如参数解密)。

  • 记录 Controller 方法的执行时间。

AOP
  • 事务管理(@Transactional)。

  • 统一日志记录(如 Service 层方法调用日志)。

  • 权限校验(通过自定义注解实现方法级权限控制)。


六. 总结

  • 过滤器是 Servlet 层级的粗粒度控制,适合处理所有请求的通用逻辑。

  • 拦截器是 Spring MVC 层级的细粒度控制,适合针对 Controller 的定制逻辑。

  • AOP是方法层级的灵活切面,适合解耦业务无关的横切关注点(如日志、事务)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值