背景
解决某个事务中需要处理参数,做额外事务,控制后续流转等目的
其中最常见的具体目的有如下
请求限流
登录拦截器
入参和出参的处理
具体某项功能权限的控制,比如消息通知队列,日志读写
具体案例
servelet,基于web容器的设计,最常用于限流,可以认为一般用于不具有任何业务逻辑的架构层,运维层的方案
spring 拦截器,基于框架的拦截器,一般用于通用业务框架的基层框架,比如是否属于合法用户
业务aop,基于具体业务做的业务控制器,粒度更小
axios的拦截器,针对请求发送前,请求拿到结果后可以做的各种处理。比如我们的处理包括校验是否为标准的json格式,为其增加有效的身份验证签名到header上,做重复请求的客户端限制,做返回内容的状态码处理,请求超时的重试
koa的洋葱模型,针对每个具体请求可以设置多层业务处理,加了以后会融合加入各种复杂并必要的功能或者限制
产品界面操作权限的多层设计,从用户,到用户权限,到业务权限,到业务逻辑都可以加入到具体业务执行之前的拦截器中,也可以根据需要灵活调整职责链中的具体项
webpack loader的多层loader处理也符合拦截器设计,主要按照正则匹配,符合时不断链式执行并返回结果继续执行
原理层
建立拦截器内的链式结构,可以增加和移出。
执行时递归访问,必要情况下允许设置每层的校验执行。
对外可提供条件,跳出当前职责链
小结
具体业务具体分析如何使用,没有标准答案,尤其业务方aop场景
职责链本身核心特点是对原某节点功能的扩展,可是原节点的增强,也可是扩展其功能与其他功能的桥接
在不同纬度,比如从网络访问,到框架层,到业务层都有不同的第三方选型,要慎重选型,并做好较好的二次封装设计