责任链模式#
一句话答案#
请求沿链传递,每个处理器决定处理或传给下一个;Spring Filter/Interceptor/AOP Advisor Chain 都是责任链。
核心要点
责任链模式将请求沿着处理者链传递,每个处理者决定是否处理该请求以及是否将其传递给下一个处理者。
核心结构:
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);
}javaJava/框架中的典型应用:
1. Servlet Filter 链
客户端请求 → Filter1 → Filter2 → Filter3 → Servlet
(编码) (登录) (权限) (业务处理)plaintext每个 Filter 通过 chain.doFilter(request, response) 将请求传递给下一个。
2. Spring Security 过滤器链
请求 → SecurityContextPersistenceFilter
→ UsernamePasswordAuthenticationFilter
→ ExceptionTranslationFilter
→ FilterSecurityInterceptor
→ ControllerplaintextSpring Security 的整个安全机制就是一条责任链,每个 Filter 负责一项安全检查。
3. Netty ChannelPipeline
入站事件 → Decoder → BusinessHandler → Encoder → 出站事件plaintextNetty 的 Pipeline 是一个双向责任链,InboundHandler 处理入站事件,OutboundHandler 处理出站事件。
责任链的优缺点:
- 优点:解耦请求发送者和处理者;动态增减处理节点;每个节点单一职责
- 缺点:请求可能到达链尾仍未被处理;链过长影响性能;调试不方便
面试回答(2分钟版)
责任链模式的核心思想是把请求沿着一条处理者链传递,每个处理者自己决定是否处理以及是否传给下一个。它的好处是解耦了请求发送者和处理者,可以动态增减处理节点,每个节点保持单一职责。在Java生态中责任链模式随处可见:Servlet Filter链是典型实现,每个Filter通过chain.doFilter()把请求传给下一个,依次做编码转换、登录校验、权限检查等;Spring Security的整个安全机制就是一条过滤器链,SecurityContextPersistenceFilter、UsernamePasswordAuthenticationFilter等依次执行各项安全检查;Netty的ChannelPipeline是双向责任链,入站事件走InboundHandler链,出站事件走OutboundHandler链。实现上每个Handler持有next引用,调用时先判断自己能否处理,不能就转发给next,链尾没人处理可以抛异常或默认处理。
追问与易错
追问方向:
- “怎么动态添加/删除处理器?”→ 维护一个 Handler 列表(如 List 或链表),通过 addHandler/removeHandler 方法动态调整;Spring Security 通过 HttpSecurity.addFilterBefore/After 在链中插入自定义 Filter
- “SS FilterChain 和 Servlet Filter 关系?”→ Spring Security 通过 DelegatingFilterProxy(一个标准 Servlet Filter)桥接到 Spring 管理的 FilterChainProxy,FilterChainProxy 内部维护多条 SecurityFilterChain,每条链包含 15+ 个安全 Filter
- “和装饰器区别?”→ 责任链中每个处理器可以选择处理或传递,请求可能被链中某个节点终止;装饰器是层层增强功能,每层都会执行且最终调用核心对象,不存在中断
易错点:
- ❌ 链中每个处理器都必须处理——可以选择传递
- ❌ 责任链性能差——链不长时影响忽略不计