项目中存在多个过滤器,请求来了之后处理过程是怎样的
当项目中存在多个过滤器时,请求会按照过滤器的优先级顺序依次经过每个过滤器的处理,形成一个“过滤器链(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 {

最低0.47元/天 解锁文章
1127

被折叠的 条评论
为什么被折叠?



