• 背景

      • 解决某个事务中需要处理参数,做额外事务,控制后续流转等目的

      • 其中最常见的具体目的有如下

        • 请求限流

        • 登录拦截器

        • 入参和出参的处理

        • 具体某项功能权限的控制,比如消息通知队列,日志读写

    • 具体案例

      • servelet,基于web容器的设计,最常用于限流,可以认为一般用于不具有任何业务逻辑的架构层,运维层的方案

      • spring 拦截器,基于框架的拦截器,一般用于通用业务框架的基层框架,比如是否属于合法用户

      • 业务aop,基于具体业务做的业务控制器,粒度更小

      • axios的拦截器,针对请求发送前,请求拿到结果后可以做的各种处理。比如我们的处理包括校验是否为标准的json格式,为其增加有效的身份验证签名到header上,做重复请求的客户端限制,做返回内容的状态码处理,请求超时的重试

      • koa的洋葱模型,针对每个具体请求可以设置多层业务处理,加了以后会融合加入各种复杂并必要的功能或者限制

      • 产品界面操作权限的多层设计,从用户,到用户权限,到业务权限,到业务逻辑都可以加入到具体业务执行之前的拦截器中,也可以根据需要灵活调整职责链中的具体项

      • webpack loader的多层loader处理也符合拦截器设计,主要按照正则匹配,符合时不断链式执行并返回结果继续执行

    • 原理层

      • 建立拦截器内的链式结构,可以增加和移出。

      • 执行时递归访问,必要情况下允许设置每层的校验执行。

      • 对外可提供条件,跳出当前职责链

    • 小结

      • 具体业务具体分析如何使用,没有标准答案,尤其业务方aop场景

      • 职责链本身核心特点是对原某节点功能的扩展,可是原节点的增强,也可是扩展其功能与其他功能的桥接

      • 在不同纬度,比如从网络访问,到框架层,到业务层都有不同的第三方选型,要慎重选型,并做好较好的二次封装设计