自学教程 学编程从这里开始

拦截过滤器模式

《拦截过滤器模式》|J2EE企业架构模式

关键词:Intercepting Filter、过滤器链、请求预处理/后处理、横切逻辑、链式调用
说明:拦截过滤器模式不属于GOF23设计模式,属于J2EE企业架构模式

一、什么是拦截过滤器模式

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

核心意图
将请求的通用横切逻辑拆分为独立过滤器,通过过滤器链串联执行;过滤器可插拔、可复用,和核心业务解耦。

角色划分

  1. Client(客户端):浏览器发起HTTP请求
  2. Filter Manager(过滤器管理器):创建过滤器链,调度过滤器执行顺序
  3. Filter Chain(过滤器链):维护过滤器列表,依次调用各个Filter
  4. Filter(过滤器):独立的拦截单元,实现预处理/后处理逻辑
  5. Target(目标资源):最终要访问的业务资源/视图,过滤器执行完成后访问

数据流:
Client Request → FilterChain[Filter1 → Filter2 → Filter3] → Target
Target Response → Filter3 → Filter2 → Filter1 → Client

二、UML结构图

角色划分:

  1. Client:发起请求
  2. FilterManager:构建过滤器链
  3. FilterChain:维护过滤器集合,控制执行顺序
  4. Filter:过滤器接口,定义execute方法
  5. ConcreteFilter:具体过滤器实现
  6. 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)。

五、优缺点总结

✅ 优点

  1. 横切逻辑拆分为独立过滤器,单一职责,可复用
  2. 过滤器支持动态添加、删除、调整顺序,可插拔
  3. 过滤器与业务代码解耦,新增公共逻辑不改动目标业务代码
  4. 便于单元测试,单个过滤器可独立测试

❌ 缺点

  1. 过滤器链过长时,排查调用链路问题比较困难
  2. 过滤器之间共享数据比较麻烦,依赖请求上下文
  3. 执行顺序很关键,顺序错误会引发非预期问题

六、框架应用场景

  • Servlet Filter(Java Web原生过滤器)
  • Spring Security 过滤器链(SecurityFilterChain)
  • 网关过滤器(Spring Cloud Gateway Filter)
  • Tomcat、Jetty等Web容器的请求拦截机制

七、小结

拦截过滤器模式核心:将请求通用处理逻辑拆成多个独立过滤器,由过滤器链串联执行,在请求到达目标资源之前完成拦截处理;过滤器可插拔,和业务逻辑解耦。

归属:J2EE架构模式,不属于GOF23;Servlet Filter、Spring Security是典型落地实现。

0 条笔记