《拦截过滤器模式》|J2EE企业架构模式
关键词:Intercepting Filter、过滤器链、请求预处理/后处理、横切逻辑、链式调用
说明:拦截过滤器模式不属于GOF23设计模式,属于J2EE企业架构模式
一、什么是拦截过滤器模式
拦截过滤器模式(Intercepting Filter Pattern):对Web请求进行链式预处理与后处理。在请求到达目标业务之前,可以挂载多个独立过滤器,按顺序执行;过滤器之间解耦,可以动态增删。过滤器负责实现横切逻辑:编码转换、登录校验、请求日志、XSS过滤、响应压缩等。
过滤器不处理核心业务,只负责对请求/响应做加工,执行完成后交给下一个过滤器,全部执行完毕再转发到目标资源。

核心意图
将请求的通用横切逻辑拆分为独立过滤器,通过过滤器链串联执行;过滤器可插拔、可复用,和核心业务解耦。
角色划分
- Client(客户端):浏览器发起HTTP请求
- Filter Manager(过滤器管理器):创建过滤器链,调度过滤器执行顺序
- Filter Chain(过滤器链):维护过滤器列表,依次调用各个Filter
- Filter(过滤器):独立的拦截单元,实现预处理/后处理逻辑
- Target(目标资源):最终要访问的业务资源/视图,过滤器执行完成后访问
数据流:
Client Request → FilterChain[Filter1 → Filter2 → Filter3] → Target
Target Response → Filter3 → Filter2 → Filter1 → Client
二、UML结构图
角色划分:
- Client:发起请求
- FilterManager:构建过滤器链
- FilterChain:维护过滤器集合,控制执行顺序
- Filter:过滤器接口,定义execute方法
- ConcreteFilter:具体过滤器实现
- Target:目标业务资源

三、Java完整示例
模拟Web过滤器链,代码全部使用英文。
// Filter 过滤器接口
public interface Filter {
void execute(String request);
}
// ConcreteFilter 具体过滤器
public class AuthenticationFilter implements Filter {
@Override
public void execute(String request) {
System.out.println("AuthenticationFilter: Authenticate request: " + request);
}
}
public class LogFilter implements Filter {
@Override
public void execute(String request) {
System.out.println("LogFilter: Log request: " + request);
}
}
// Target 目标资源
public class Target {
public void execute(String request) {
System.out.println("Target: Processing request: " + request);
}
}
// Filter Chain 过滤器链
import java.util.ArrayList;
import java.util.List;
public class FilterChain {
private List<Filter> filterList = new ArrayList<>();
private Target target;
public void addFilter(Filter filter){
filterList.add(filter);
}
public void setTarget(Target target){
this.target = target;
}
public void execute(String request){
for(Filter filter : filterList){
filter.execute(request);
}
target.execute(request);
}
}
// Filter Manager 过滤器管理器
public class FilterManager {
FilterChain filterChain;
public FilterManager(Target target){
filterChain = new FilterChain();
filterChain.setTarget(target);
}
public void setFilter(Filter filter){
filterChain.addFilter(filter);
}
public void filterRequest(String request){
filterChain.execute(request);
}
}
// Client
public class Client {
FilterManager filterManager;
public void setFilterManager(FilterManager filterManager){
this.filterManager = filterManager;
}
public void sendRequest(String request){
filterManager.filterRequest(request);
}
public static void main(String[] args) {
Target target = new Target();
FilterManager filterManager = new FilterManager(target);
filterManager.setFilter(new AuthenticationFilter());
filterManager.setFilter(new LogFilter());
Client client = new Client();
client.setFilterManager(filterManager);
client.sendRequest("GET /api/user");
}
}
运行输出:
AuthenticationFilter: Authenticate request: GET /api/user
LogFilter: Log request: GET /api/user
Target: Processing request: GET /api/user
四、拦截过滤器模式 vs 前端控制器模式
| 模式 | 定位 | 核心区别 |
|---|---|---|
| 拦截过滤器模式 | J2EE架构模式,链式拦截 | 多个独立过滤器,链式串行执行,可动态插拔,侧重请求预处理 |
| 前端控制器模式 | J2EE架构模式,统一入口 | 单一全局控制器,接收请求后路由分发,侧重请求路由调度 |
两者经常搭配使用:请求先经过Filter过滤器链,再进入Front Controller(DispatcherServlet)。
五、优缺点总结
✅ 优点
- 横切逻辑拆分为独立过滤器,单一职责,可复用
- 过滤器支持动态添加、删除、调整顺序,可插拔
- 过滤器与业务代码解耦,新增公共逻辑不改动目标业务代码
- 便于单元测试,单个过滤器可独立测试
❌ 缺点
- 过滤器链过长时,排查调用链路问题比较困难
- 过滤器之间共享数据比较麻烦,依赖请求上下文
- 执行顺序很关键,顺序错误会引发非预期问题
六、框架应用场景
- Servlet Filter(Java Web原生过滤器)
- Spring Security 过滤器链(SecurityFilterChain)
- 网关过滤器(Spring Cloud Gateway Filter)
- Tomcat、Jetty等Web容器的请求拦截机制
七、小结
拦截过滤器模式核心:将请求通用处理逻辑拆成多个独立过滤器,由过滤器链串联执行,在请求到达目标资源之前完成拦截处理;过滤器可插拔,和业务逻辑解耦。
归属:J2EE架构模式,不属于GOF23;Servlet Filter、Spring Security是典型落地实现。
0 条笔记