4.6 拦截过滤器模式
拦截过滤器模式(Intercepting Filter)把横切关注点(鉴权、日志、压缩、编码转换、限流……)做成一串可插拔的过滤器,让请求在到达真正的业务处理器之前、响应在返回之前,依次穿过这些过滤器。业务逻辑因此保持干净,公共处理被集中管理。
下面的实验让你一步步推进一个请求,看它如何先穿过过滤器链,到达目标,再反向穿回——前处理与后处理一目了然。
正在加载交互实验...
过滤管理器让过滤器可插拔
java
class FilterManager {
private FilterChain chain = new FilterChain();
void addFilter(Filter f) { chain.addFilter(f); } // 声明式增删
void filterRequest(Request r) { chain.execute(r); }
}
// 想加一个横切关注点?写一个 Filter 并注册,目标处理器一行不改
manager.addFilter(new AuthFilter());
manager.addFilter(new GzipFilter());新增、删除、重排过滤器都不影响业务目标,也不影响其它过滤器。下面的实验让你开关各个过滤器,观察生效的过滤链如何动态变化。
正在加载交互实验...
正在加载概念检查...
它和责任链是什么关系
拦截过滤器和责任链(3.1 节)结构非常相似,都是“请求穿过一串处理者”。区别在侧重:
- 责任链:常常“找到第一个能处理的就停”,请求最终被某一个处理者消费。
- 拦截过滤器:通常“每个过滤器都参与”,做的是前/后处理这类横切工作,请求最终交给目标处理器,而不是被某个过滤器独吞。
正在加载概念检查...
无处不在的现实
Servlet 的 Filter、各类 Web 框架的中间件管线(Express middleware、ASP.NET middleware、Spring 的拦截器/过滤器)、API 网关的插件链——全都是拦截过滤器的现实化身。它和 AOP(面向切面编程)解决的是同一类问题:把散落在各处的横切逻辑收拢到可组合的一层。
正在加载本节练习...