第 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

服务器扩展点
在服务器处理管道中,您可以在以下任意扩展点中添加过滤器(或拦截器):
-
PreMatchContainerRequest
过滤器 -
containerRequest
过滤器 -
ReadInterceptor
-
ContainerResponse
过滤器 -
WriteInterceptor
请注意,在发生资源匹配 前,会达到 PreMatchContainerRequest
扩展点,因此此时一些上下文元数据将不可用。
客户端处理管道
图 61.2 “客户端过滤和 Interceptor Extensension Point” 显示用于 JAX-RS 过滤器和客户端上安装的拦截器的处理管道的概述。
图 61.2. 客户端过滤和 Interceptor Extensension Point

客户端扩展点
在客户端处理管道中,您可以在以下任意扩展点中添加过滤器(或拦截器):
-
ClientRequest
过滤器 -
WriteInterceptor
-
ClientResponse
过滤器 -
ReadInterceptor
过滤和拦截器顺序
如果您在相同扩展点中安装多个过滤器或拦截器,过滤器的执行顺序取决于分配给它们的优先级(在 Java 源中使用 @Priority
注释)。优先级以整数值表示。通常,具有 较高优先级 号的过滤器会更接近服务器上的资源方法调用;而具有 较低优先级 号的过滤器则接近客户端调用。换句话说,对 请求 消息执行的过滤器和拦截器会按优先级编号 降序执行;而过滤器和拦截器对 响应 消息执行,则以降序为 优先级编号执行。
过滤类
可以实施以下 Java 接口以创建自定义 REST 消息过滤器:
拦截器类
可以实施以下 Java 接口,以创建自定义 REST 消息拦截器: