第 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 拦截器链

描述使用 in 和 out interceptor 链的端点

Apache CXF 中的消息处理

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

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

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

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

    拦截器链通过在之前调用的所有拦截器上调用 fault 处理方法。

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

    注意

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

  7. 如果入站链上的任何拦截器创建错误条件,则链为 unwound。
  8. 当消息到达入站拦截器链的末尾时,它将传回到应用程序代码。

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

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

    拦截器链通过在之前调用的所有拦截器上调用 fault 处理方法。

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

    注意

    如果响应是例外的,它将通过故障处理拦截器链传递。

  7. 如果出站链上的任何拦截器创建错误条件,则链为 unwound,并会分配错误消息。
  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 章 配置端点以使用拦截器
Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.