第 61 章 JAX-RS 2.0 过滤器和拦截器


摘要

JAX-RS 2.0 定义在 REST 调用的处理管道中安装过滤器和拦截器的标准 API 和语义。过滤器和拦截器通常用于提供日志记录、身份验证、授权、消息压缩、消息加密等功能。

61.1. JAX-RS 过滤器和拦截器介绍

概述

本节概述了 JAX-RS 过滤器和拦截器的处理管道,强调可以安装过滤器链或拦截器链的扩展点。

过滤器

JAX-RS 2.0 过滤器 是一种插件类型,使开发人员能够访问通过 CXF 客户端或服务器的所有 JAX-RS 消息。过滤器适合处理与消息关联的元数据:HTTP 标头、query 参数、介质类型和其他元数据。过滤器具有中止消息调用的能力(例如,对于安全插件很有用)。

如果您类似,您可以在每个扩展点中安装多个过滤器,在这种情况下,过滤器在链中执行(执行顺序是未定义,除非为每个已安装的过滤器指定了一个 优先级值 )。

拦截器

JAX-RS 2.0 拦截器 是类型插件,使开发人员能够像被读取或写入时赋予对消息正文的访问权限。拦截器围绕 MessageBodyReader.readFrom 方法调用(用于读取拦截器)或 MessageBodyWriter.writeTo 方法调用(用于 writer 拦截器)。

如果您类似,您可以在每个扩展点上安装多个拦截器,在这种情况下,拦截器是未定义的(除非您为每个安装的拦截器指定 优先级值 )。

服务器处理管道

图 61.1 “server-Side Filter 和 Interceptor Extension Points” 演示了在服务器端安装的 JAX-RS 过滤器和拦截器的处理管道的概述。

图 61.1. server-Side Filter 和 Interceptor Extension Points

jaxrs20filters 01

服务器扩展点

在服务器处理管道中,您可以在以下任意扩展点中添加过滤器(或拦截器):

  1. PreMatchContainerRequest 过滤器
  2. containerRequest 过滤器
  3. ReadInterceptor
  4. ContainerResponse 过滤器
  5. WriteInterceptor

请注意,在发生资源匹配 ,会达到 PreMatchContainerRequest 扩展点,因此此时一些上下文元数据将不可用。

客户端处理管道

图 61.2 “客户端过滤和 Interceptor Extensension Point” 显示用于 JAX-RS 过滤器和客户端上安装的拦截器的处理管道的概述。

图 61.2. 客户端过滤和 Interceptor Extensension Point

jaxrs20filters 02

客户端扩展点

在客户端处理管道中,您可以在以下任意扩展点中添加过滤器(或拦截器):

  1. ClientRequest 过滤器
  2. WriteInterceptor
  3. ClientResponse 过滤器
  4. ReadInterceptor

过滤和拦截器顺序

如果您在相同扩展点中安装多个过滤器或拦截器,过滤器的执行顺序取决于分配给它们的优先级(在 Java 源中使用 @Priority 注释)。优先级以整数值表示。通常,具有 较高优先级 号的过滤器会更接近服务器上的资源方法调用;而具有 较低优先级 号的过滤器则接近客户端调用。换句话说,对 请求 消息执行的过滤器和拦截器会按优先级编号 降序执行;而过滤器和拦截器对 响应 消息执行,则以降序为 优先级编号执行。

过滤类

可以实施以下 Java 接口以创建自定义 REST 消息过滤器:

拦截器类

可以实施以下 Java 接口,以创建自定义 REST 消息拦截器:

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

© 2024 Red Hat, Inc.