责任链模式是实现灵活拦截器最自然的选择——它把多个处理逻辑串成一条可插拔、可排序、可中断的链,让每个拦截器只关心“自己该不该做”和“要不要放行”。

责任链模式是实现灵活拦截器最自然的选择——它把多个处理逻辑串成一条可插拔、可排序、可中断的链,让每个拦截器只关心“自己该不该做”和“要不要放行”,而不是硬编码调用顺序。
核心结构怎么搭
一个轻量但完整的责任链拦截器需三类角色:
-
抽象拦截器:定义统一接口,比如
boolean preHandle(Context ctx)和void afterHandle(Context ctx),并持有next引用 -
具体拦截器:如
AuthInterceptor、LogInterceptor、RateLimitInterceptor,各自实现业务判断逻辑 -
链管理器:负责组装、排序、执行,例如提供
add(Interceptor i, int order)方法,内部按order升序组织为链表或数组
Spring Boot里怎么落地
Spring本身已内置责任链语义,直接复用更高效:
- 用
HandlerInterceptor实现自定义拦截器,重写preHandle返回false即中断链 - 在配置类中通过
registry.addInterceptor(...).order(1)控制执行优先级 - 多个拦截器自动组成链,框架在
DispatcherServlet中按序触发,无需手动维护next - 若需更细粒度控制(如链内跳过某节点),可封装一层
InterceptChain类,自行调度
关键细节不能漏
真正用起来容易踩坑的地方集中在三点:
AI 舌诊面诊问诊医疗系统 + 诊疗商城系统源码是一套结合 AI 辅助诊断与商品转化的健康类程序,基于浩创云、ThinkPHP(PHP)开发,支持微信服务号与 H5 端,适合做中医舌诊面诊问答、健康建议推送以及配套诊疗商品的运营。
-
中断必须显式返回 false:很多开发者忘了
preHandle返回false才会终止后续拦截器和目标方法,只写逻辑不返值等于没拦截 -
order 值要错开:避免多个拦截器用相同
order导致执行顺序不确定;建议预留间隔(如 10、20、30)方便后期插入 -
上下文要可传递:拦截器之间常需共享数据(如用户ID、请求ID),别用静态变量,应将信息存入
Context或RequestAttributes等线程绑定容器
比硬编码链好在哪
不用责任链时,拦截逻辑常写成:
if (authOk()) { if (rateOk()) { if (logOk()) { doBusiness(); } } }
这种嵌套耦合高、难扩展、难测试。而责任链让每个环节解耦独立:
- 新增拦截器只需实现接口 + 注册,不改原有代码
- 测试单个拦截器时,mock
next即可,无需启动整个Web容器 - 线上可动态启用/禁用某拦截器(如灰度开关),只要链管理器支持运行时刷新

















