项目中存在多个过滤器,请求来了之后处理过程是怎样的

项目中存在多个过滤器,请求来了之后处理过程是怎样的

当项目中存在多个过滤器时,请求会按照过滤器的优先级顺序依次经过每个过滤器的处理,形成一个“过滤器链(FilterChain)”。整个处理过程遵循“请求顺序执行,响应逆序执行”的规则,具体流程如下:

一、核心原理:过滤器链(FilterChain)

Web容器会将所有过滤器按优先级组成一个链式结构FilterChain)。当请求到达时,会按顺序经过链中的每个过滤器;当请求处理完成并返回响应时,会按相反顺序再次经过这些过滤器。

关键特点:

  • 顺序性:优先级高(order值小)的过滤器先处理请求。
  • 传递性:每个过滤器必须通过chain.doFilter(request, response)将请求传递给下一个过滤器,否则链条会中断,请求无法到达目标资源(如Controller)。
  • 双向性:请求阶段按正序执行,响应阶段按逆序执行。

二、详细处理流程(示例)

假设项目中有3个过滤器,优先级为:FilterA(order=1)FilterB(order=2)FilterC(order=3)(数值越小优先级越高)。

1. 请求阶段(客户端 → 目标资源)
客户端发送请求 → 
  FilterA.doFilter() → 
    [FilterA的请求预处理逻辑] → 
    chain.doFilter() → (传递给下一个过滤器)
  FilterB.doFilter() → 
    [FilterB的请求预处理逻辑] → 
    chain.doFilter() → 
  FilterC.doFilter() → 
    [FilterC的请求预处理逻辑] → 
    chain.doFilter() → 
  目标资源(Controller/Servlet)处理请求
  • 每个过滤器的doFilter方法中,chain.doFilter()之前的逻辑会在请求到达目标资源前执行(如验证、日志记录)。
  • 只有调用chain.doFilter(),请求才会继续传递到下一个过滤器或目标资源。
2. 响应阶段(目标资源 → 客户端)

目标资源处理完请求后,响应会按相反顺序经过过滤器:

目标资源处理完成 → 
  FilterC.doFilter() → 
    [FilterC的响应后处理逻辑] → (chain.doFilter()之后的逻辑)
  FilterB.doFilter() → 
    [FilterB的响应后处理逻辑] → 
  FilterA.doFilter() → 
    [FilterA的响应后处理逻辑] → 
  响应返回给客户端
  • 每个过滤器的doFilter方法中,chain.doFilter()之后的逻辑会在响应返回客户端前执行(如修改响应头、压缩数据)。

三、代码示例:过滤器链执行顺序

// 过滤器A(order=1)
public class FilterA implements Filter {
   
   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值