面试知识库
进阶

责任链模式#

一句话答案#

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

核心要点

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

核心结构:

Java/框架中的典型应用:

1. Servlet Filter 链

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

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

2. Spring Security 过滤器链

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

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

3. Netty ChannelPipeline

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

Netty 的 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
  • “和装饰器区别?”→ 责任链中每个处理器可以选择处理或传递,请求可能被链中某个节点终止;装饰器是层层增强功能,每层都会执行且最终调用核心对象,不存在中断

易错点:

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