第 55 章 Apache CXF 运行时中的拦截器

摘要

Apache CXF 运行时的大部分功能由拦截器实施。Apache CXF 运行时创建的每个端点都有三个用于处理消息的潜在拦截器链。这些链中的拦截器负责转换在线路间传输的原始数据与端点实施代码处理的 Java 对象之间的消息。拦截器被组织为阶段,以确保正确顺序进行处理。

概述

Apache CXF 处理消息的主要部分。当消费者对远程服务进行调用时,运行时需要将数据整理到服务可使用的消息中,并将其置于线路上。服务提供商必须传播消息,执行其业务逻辑,并将响应分到相应的消息格式。然后,消费者必须总结响应消息,将其与正确的请求相关联,并将它传递到消费者的应用代码。除了基本的 marshaling 和 unmarshaling 外,Apache CXF 运行时还可使用消息数据执行许多其他事务。例如,如果激活 WS-RM,运行时必须处理消息块和确认消息,然后再进行 marshaling 和 unmarshaling 消息。如果激活安全性,则运行时必须验证消息的凭据作为消息处理序列的一部分。

图 55.1 “Apache CXF 拦截器链” 显示服务提供商收到请求消息的基本路径。

图 55.1. Apache CXF 拦截器链

使用 in 和 out拦截器链来描述端点

Apache CXF 中的消息处理

当 Apache CXF 开发的用户调用远程服务时,会启动以下消息处理序列:

  1. Apache CXF 运行时会创建一个出站拦截器链,以处理请求。
  2. 如果调用启动双向消息交换,则运行时会创建入站拦截器链和故障处理拦截器链。
  3. 请求消息通过出站拦截器链按顺序传递。

    链中的每个拦截器在消息上执行一些处理。例如,Apache CXF 提供的 SOAP 拦截器在 SOAP envelope 中打包信息。

  4. 如果出站链上的任何拦截器创建错误条件,则链的出现不一致,并将控制权返回到应用程序级代码。

    通过在之前调用的拦截器在所有调用拦截器上调用错误处理方法,以此形成拦截器链。

  5. 请求被发送到适当的服务提供商。
  6. 收到响应后,它将按顺序通过入站拦截器链传输。

    注意

    如果响应是错误消息,它将被传递到错误处理拦截器链。

  7. 如果入站链上的任何拦截器都创建一个错误条件,则链将无用。
  8. 当消息到达入站拦截器链的末尾时,它将重新传递给应用代码。

当 Apache CXF 开发服务供应商从消费者收到请求时,会有一个类似的过程:

  1. Apache CXF 运行时会创建一个入站拦截器链,以处理请求消息。
  2. 如果请求是双向消息交换的一部分,运行时还会创建出站拦截器链和故障处理拦截器链。
  3. 请求通过入站拦截器链按顺序传递。
  4. 如果入站链上的任何拦截器都创建一个错误条件,则该链将不一致,并将错误分配给消费者。

    通过在之前调用的拦截器在所有调用拦截器上调用错误处理方法,以此形成拦截器链。

  5. 当请求到达入站拦截器链的末尾时,它将传递给服务实施。
  6. 当响应就绪后,它通过出站拦截器链按顺序传递。

    注意

    如果响应是异常,它将通过错误处理拦截器链进行传递。

  7. 如果出站链上的任何拦截器都创建一个错误条件,则链将不一致,并且会发送出错信息。
  8. 当请求到达出站链的末尾后,它将被分配给消费者。

拦截器

Apache CXF 运行时中的所有消息都通过 拦截器 完成。拦截器是 POJO,可在将消息数据传递给应用程序层之前访问消息数据。它们可以执行一系列操作,包括:转换信息、从消息中剥离标头或验证消息数据。例如,拦截器可以读取消息的安全标头,根据外部安全服务验证凭证,并决定消息处理是否可以继续。

拦截器可用的消息数据由以下几个因素决定:

  • 拦截器链
  • 拦截器的阶段
  • 之前在链中进行的其他拦截器

阶段

拦截器组织为 阶段。阶段是具有常见功能的拦截器的逻辑分组。每个阶段负责特定类型的消息处理。例如,处理被传递给应用程序层的 marshaled Java 对象的拦截器都会在同一阶段发生。

拦截器链

阶段聚合成 拦截器链。拦截器链列表是根据消息是入站还是出站的、排序的拦截器阶段列表。

使用 Apache CXF 创建的每个端点都有三个拦截器链:

  • 用于入站消息的链
  • 用于出站消息的链
  • 错误消息的链

拦截器链主要根据端点使用的绑定和传输进行构建。在链中添加其他运行时功能,如安全或日志记录。开发人员也可以使用配置在链中添加自定义拦截器。

开发拦截器

无论其功能如何,开发拦截器始终遵循相同的基本步骤:

  1. 第 56 章 Interceptor API

    Apache CXF 提供多个提取拦截器,以便更轻松地开发自定义拦截器。

  2. 第 57.2 节 “指定拦截器的阶段”

    拦截器需要消息的某些部分可用,并要求数据处于特定格式。信息内容和数据格式部分由拦截器的阶段决定。

  3. 第 57.3 节 “在一个阶段约束拦截器放置”

    通常,在阶段内拦截器的排序并不重要。但是,在某些情况下,务必要确保在同一阶段之前或之后执行拦截器。

  4. 第 58.2 节 “处理消息”
  5. 第 58.3 节 “错误后卸载”

    如果在执行拦截器后的活跃拦截器链中发生错误,则会调用其故障处理逻辑。

  6. 第 59 章 配置端点以使用拦截器