Red Hat Training

A Red Hat training course is available for Red Hat Fuse

第 61 章 JAX-RS 2.0 Filters 和 Interceptors

摘要

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

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

概述

本节概述 JAX-RS 过滤器和拦截器的处理管道,突出显示可能安装过滤器链或拦截器链的扩展点。

过滤器

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

如果您愿意,您可以在每个扩展点上安装多个过滤器,在这种情况下,在链中执行过滤器(但未定义执行顺序),除非为每个安装过滤器指定 优先级值

拦截器

JAX-RS 2.0 拦截器 是一类插件,使开发人员能够访问消息正文,因为它正在读取或写入。拦截器围绕 MessageBodyReader.readFrom 方法调用(用于 reader interceptors)或 MessageBodyWriter.writeTo 方法调用(用于 writer interceptors)。

如果您愿意,您可以在每个扩展点安装多个拦截器,在这种情况下,拦截器在链中执行(未定义执行顺序,除非您为每个安装的拦截器指定 优先级值 )。

服务器处理管道

图 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 “Client-Side Filter 和 Interceptor Extension Points” 显示 JAX-RS 过滤器的处理管道概述,以及在客户端一侧安装的拦截器。

图 61.2. Client-Side Filter 和 Interceptor Extension Points

jaxrs20filters 02

客户端扩展点

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

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

过滤和拦截器顺序

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

过滤类

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

拦截器类

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