面试知识库
高 进阶

责任链模式#

一句话答案#

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

核心要点

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

核心结构:

Java/框架中的典型应用:

1. Servlet Filter 链

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

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

2. Spring Security 过滤器链

请求 → SecurityContextHolderFilter
     → UsernamePasswordAuthenticationFilter
     → ExceptionTranslationFilter
     → AuthorizationFilter
     → Controller
plaintext

(Spring Security 6 起 SecurityContextHolderFilter 取代已废弃的 SecurityContextPersistenceFilter,AuthorizationFilter 取代 FilterSecurityInterceptor;7.0 把后者所在的旧 Access API 挪到了可选模块 spring-security-access。) Spring Security 的整个安全机制就是一条责任链,每个 Filter 负责一项安全检查。

3. Netty ChannelPipeline

入站(head → tail):Decoder → BusinessHandler
出站(tail → head):BusinessHandler write() → Encoder → Socket
plaintext

Netty 的 Pipeline 是一个双向责任链,入站事件从 head 往 tail 只经过 InboundHandler,出站事件从 tail 往 head 只经过 OutboundHandler,所以 Encoder 不在入站路径上。

4. Spring MVC HandlerInterceptor

HandlerExecutionChain 持有 Handler + 拦截器列表,不靠 next 引用而是按下标遍历:preHandle 正序执行,任一返回 false 就中断(并对已通过的拦截器倒序调 afterCompletion);postHandle、afterCompletion 倒序执行。

形态差异:GoF 经典责任链是「找到一个能处理的就停」;Servlet Filter / Interceptor 是变体——每个节点都做自己的事再往下传,任一节点可中断。Filter 由 FilterChain 保存链条位置,节点里调 chain.doFilter() 才继续,不调就中断。

责任链的优缺点:

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

面试回答(2分钟版)

责任链模式的核心思想是把请求沿着一条处理者链传递,每个处理者自己决定是否处理以及是否传给下一个。它的好处是解耦了请求发送者和处理者,可以动态增减处理节点,每个节点保持单一职责。在Java生态中责任链模式随处可见:Servlet Filter链是典型实现,每个Filter通过chain.doFilter()把请求传给下一个,依次做编码转换、登录校验、权限检查等;Spring Security的整个安全机制就是一条过滤器链,SecurityContextHolderFilter、UsernamePasswordAuthenticationFilter、AuthorizationFilter等依次执行各项安全检查;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,每条链包含一组安全 Filter(默认配置下十几个,具体数量随启用的功能变化)
  • “和装饰器区别?”→ 责任链中每个处理器可以选择处理或传递,请求可能被链中某个节点终止;装饰器是层层增强功能,每层都会执行且最终调用核心对象,不存在中断

易错点:

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