最典型的是Tomcat的Valve链和Spring MVC的HandlerExecutionChain,二者均基于责任链模式实现模块化请求处理:Valve链通过有序Valve组件在容器前处理横切逻辑,HandlerExecutionChain则通过拦截器在Controller前执行预/后处理。
java中apache基础架构(如apache commons、apache tomcat或apache camel等)的请求处理链并非单一标准模型,而是依具体项目而异。但若聚焦于“模块化流转”这一核心诉求,最典型、最契合的实现是 apache commons chain(已归档但思想影响深远)以及现代更主流的 tomcat 的 valve 链 和 spring webmvc 的 handlerexecutionchain。它们都通过责任链模式实现请求处理逻辑的解耦与可插拔。
Valve 链:Tomcat 内置的模块化请求流转机制
Tomcat 使用 Valve 组件构建一个可配置的、有序的处理链,每个 Valve 负责一类横切职责(如日志、认证、压缩),请求按顺序流经各 Valve,再交由容器(Engine → Host → Context → Wrapper)处理 Servlet。
- Valve 实现
org.apache.catalina.Valve接口,重写invoke(Request, Response)方法,在调用getNext().invoke()前后可插入自定义逻辑 - 可在
server.xml中声明 Valve,例如:<Valve className="org.apache.catalina.valves.AccessLogValve" .../> - 内置常见 Valve 包括:
RemoteAddrValve(IP过滤)、SSLValve(HTTPS增强)、StuckThreadDetectionValve(线程卡顿检测)
HandlerExecutionChain:Spring MVC 的可扩展处理链
Spring MVC 将请求分发到 Controller 前,会组装一个 HandlerExecutionChain,它包含目标处理器(Handler)和一组 HandlerInterceptor。拦截器按注册顺序执行 preHandle、postHandle、afterCompletion,形成清晰的模块化切面控制流。
- 拦截器可按功能模块组织:鉴权拦截器、参数校验拦截器、日志埋点拦截器、灰度路由拦截器
- 通过
WebMvcConfigurer.addInterceptors()注册,支持路径匹配与排序(Ordered或@Order) - 与 Spring AOP 不同,它是 Web 层专用、轻量、无代理开销的链式扩展点
Chain 模式抽象:从 Commons Chain 到现代实践
虽然 Apache Commons Chain 已停止维护,但其理念被广泛继承——将业务流程建模为 Command 链,每个 Command 实现 execute(Context),返回 boolean 控制是否继续流转。该模型适合工作流、审批流、规则引擎等场景。
- Context 作为统一上下文载体(类似 Map),供各 Command 读写共享数据
- 链可动态构建(XML 配置或 Java API),支持分支(
LookupCommand)、循环(WhileCommand)等扩展 - 当前可使用
org.springframework.web.servlet.HandlerInterceptor或自定义Function<Request, Response>链模拟类似行为
真正落地时,选择哪种链取决于所处技术栈:Tomcat 环境优先考虑 Valve;Spring 生态首选 Interceptor + Filter 组合;复杂业务编排则可借鉴 Chain 思想自行封装命令链。关键不在用哪个组件,而在保持每个环节职责单一、输入输出明确、易于替换与测试。
立即学习“Java免费学习笔记(深入)”;










