Skip to content
进阶

一句话答案

请求沿链传递,每个处理器决定处理或传给下一个;Spring Filter/Interceptor/AOP Advisor Chain 都是责任链。

核心要点

责任链模式将请求沿着处理者链传递,每个处理者决定是否处理该请求以及是否将其传递给下一个处理者。

核心结构:

java
public abstract class Handler {
    protected Handler next; // 指向下一个处理者
    
    public void setNext(Handler next) {
        this.next = next;
    }
    
    public void handle(Request request) {
        if (canHandle(request)) {
            doHandle(request);
        } else if (next != null) {
            next.handle(request); // 传递给下一个
        }
    }
    
    protected abstract boolean canHandle(Request request);
    protected abstract void doHandle(Request request);
}

Java/框架中的典型应用:

1. Servlet Filter 链

客户端请求 → Filter1 → Filter2 → Filter3 → Servlet
              (编码)    (登录)    (权限)    (业务处理)

每个 Filter 通过 chain.doFilter(request, response) 将请求传递给下一个。

2. Spring Security 过滤器链

请求 → SecurityContextPersistenceFilter
     → UsernamePasswordAuthenticationFilter
     → ExceptionTranslationFilter
     → FilterSecurityInterceptor
     → Controller

Spring Security 的整个安全机制就是一条责任链,每个 Filter 负责一项安全检查。

3. Netty ChannelPipeline

入站事件 → Decoder → BusinessHandler → Encoder → 出站事件

Netty 的 Pipeline 是一个双向责任链,InboundHandler 处理入站事件,OutboundHandler 处理出站事件。

责任链的优缺点:

  • 优点:解耦请求发送者和处理者;动态增减处理节点;每个节点单一职责
  • 缺点:请求可能到达链尾仍未被处理;链过长影响性能;调试不方便

四、行为型模式

追问与易错

追问方向:

  • 怎么动态添加/删除处理器?
  • SS FilterChain 和 Servlet Filter 关系?
  • 和装饰器区别?

易错点:

  • ❌ 链中每个处理器都必须处理——可以选择传递
  • ❌ 责任链性能差——链不长时影响忽略不计

💡 记忆锚点

机场安检流水线:行李过X光机 → 人过安检门 → 证件核验 → 随身物品检查,每关自己决定放行还是拦截,不行就到此为止。Servlet Filter链、Spring Security过滤器链、Netty Pipeline都是这条流水线。