第 55 章 Apache CXF 运行时中的拦截器
摘要
Apache CXF 运行时中的大多数功能都由拦截器实现。Apache CXF 运行时创建的每个端点都有三个潜在的拦截器链来处理消息。这些链中的拦截器负责在线路传输的原始数据之间转换消息,以及由端点实施代码处理的 Java 对象。拦截器被组织为阶段,以确保以正确的顺序进行处理。
概述
Apache CXF 处理消息的很大部分。当消费者对远程服务进行调用时,运行时需要将数据放入服务可以使用的消息并将其放在线上。服务供应商必须 unmarshal 消息,执行其业务逻辑,并将响应放入适当的消息格式。然后,消费者必须 unmarshal 响应消息,将其与正确的请求相关联,并将其传递回消费者的应用程序代码。除了基本的 marshaling 和 unmarshaling 外,Apache CXF 运行时还可以执行一些其他操作及消息数据。例如,如果已激活 WS-RM,则运行时必须在 marshaling 和 unmarshaling 前处理消息块和确认消息。如果激活了安全性,则运行时必须验证消息的凭据,作为消息处理序列的一部分。
图 55.1 “Apache CXF 拦截器链” 显示请求消息在由服务提供商接收时采用的基本路径。
图 55.1. Apache CXF 拦截器链
Apache CXF 中的消息处理
当 Apache CXF 开发使用者调用远程服务时,启动以下消息处理序列:
- Apache CXF 运行时会创建一个出站拦截器链来处理请求。
- 如果调用启动双向消息交换,则运行时会创建一个入站拦截器链和一个故障处理拦截器链。
请求消息通过出站拦截器链按顺序传递。
链中的每个拦截器对消息执行一些处理。例如,Apache CXF 提供 SOAP 拦截器会打包 SOAP 信封中的消息。
如果出站链上的任何拦截器创建错误条件,则链将被 unwound 并且控制返回到应用程序级别代码。
拦截器链通过在之前调用的所有拦截器上调用 fault 处理方法。
- 请求将发送到适当的服务提供商。
收到响应时,它将按顺序通过入站拦截器链传递。
注意如果响应是错误消息,它将被传递给故障处理拦截器链。
- 如果入站链上的任何拦截器创建错误条件,则链为 unwound。
- 当消息到达入站拦截器链的末尾时,它将传回到应用程序代码。
当 Apache CXF 开发的服务供应商从消费者收到请求时,会出现类似的过程:
- Apache CXF 运行时会创建一个入站拦截器链来处理请求消息。
- 如果请求是双向消息交换的一部分,则运行时还会创建一个出站拦截器链和一个故障处理拦截器链。
- 请求通过入站拦截器链按顺序传递。
如果入站链上的任何拦截器创建错误条件,则链将被取消设置,并将故障分配给消费者。
拦截器链通过在之前调用的所有拦截器上调用 fault 处理方法。
- 当请求到达入站拦截器链的末尾时,它将传递给服务实施。
当响应就绪时,它将按顺序通过出站拦截器链传递。
注意如果响应是例外的,它将通过故障处理拦截器链传递。
- 如果出站链上的任何拦截器创建错误条件,则链为 unwound,并会分配错误消息。
- 请求到达出站链的末尾后,它将分配给消费者。
拦截器
Apache CXF 运行时中的所有消息处理都由 拦截器 完成。拦截器是在传递给应用程序层之前可以访问消息数据的 POJO。他们可以执行很多操作,包括:转换消息、去除消息的标头或验证消息数据。例如,拦截器是否可以从消息中读取安全标头,对外部安全服务验证凭证,并确定消息处理是否可以继续。
拦截器可用的消息数据由以下几个因素决定:
- 拦截器的链
- 拦截器的阶段
- 前面在链中发生的其他拦截器
阶段
拦截器分为几个 阶段。阶段是具有通用功能的拦截器的逻辑分组。每个阶段负责特定类型的消息处理。例如,处理传递给应用程序层的 marshaled Java 对象的拦截器都会在同一阶段中发生。
拦截器链
阶段被聚合为 拦截器链。拦截器链是根据消息是入站还是出站排序的拦截器阶段列表。
使用 Apache CXF 创建的每个端点都有三个拦截器链:
- 入站消息的链
- 用于出站消息的链
- 错误消息的链
拦截器链主要基于端点使用的绑定和传输进行构建。添加其他运行时功能(如安全或日志记录)还会在链中添加拦截器。开发人员也可以使用配置将自定义拦截器添加到链中。
开发拦截器
无论其功能是什么,都遵循相同的基本步骤:
Apache CXF 提供了多个抽象拦截器,以便更轻松地开发自定义拦截器。
拦截器要求消息的某些部分可用,并需要数据采用特定格式。消息内容和数据格式由拦截器的阶段部分决定。
通常,阶段内拦截器的顺序不重要。然而,在某些情况下,可能务必要确保拦截器在之前或之后在同一阶段中执行。
- 第 58.2 节 “处理消息”
如果在执行拦截器后在活跃拦截器链中发生错误,则会调用其故障处理逻辑。
- 第 59 章 配置端点以使用拦截器