5.4.3. 其他 RESTEasy 更改
SignedInput 和 SignedOuput
-
用于
resteasy-crypto的必须在SignedInput和 SignedOutputRequest或Response对象中将Content-Type设置为multipart/signed,或使用@Consumes或@Produces注释。 -
SignedOutput和SignedInput可用于通过在@Produces 或 @Consumes注释中设置该类型,以二进制形式返回application/pkcs7-signatureMIME 类型格式。 -
如果
@Produces 或@Consumes是text/plainMIME 类型,则SignedOutput将采用 base64 编码并作为字符串发送。
安全过滤器
@RolesAllowed、@PermitAll 和 @ DenyAll 的安全过滤器现在返回"403 Forbidden"而不是 "401 Unauthorized"。
客户端过滤器
当您在 RESTEasy 3.0 之前使用 RESTEasy 客户端 API 时,在 JAX-RS 2.0 中引入的客户端侧过滤器不会被绑定并运行。
异步 HTTP 支持
由于 JAX-RS 2.0 规范添加了使用 @Suspended 注释 和 AsynResponse 接口的异步 HTTP 支持,因此异步 HTTP 的 RESTEasy 专有 API 已被弃用,可能在以后的 RESTEasy 发行版中删除。异步 Tomcat 和异步 JBoss Web 模块已从服务器安装中删除。如果您不使用 Servlet 3.0 容器或更高版本,则将使用相同的请求线程模拟和同步运行异步 HTTP 服务器端处理。
服务器端缓存
服务器端缓存设置已更改。如需更多信息,请参阅 RESTEasy 文档。
YAML 提供程序设置更改
在之前的 JBoss EAP 版本中,RESTEasy YAML 提供程序设置默认为启用。这在 JBoss EAP 7 中有所改变。现在默认禁用 YAML 供应商。由于 RESTEasy 用于取消托管的 SnakeYAML 库中存在安全问题,因此不支持使用它,而且必须在应用中明确启用它。有关如何在应用中启用 YAML 提供程序和添加 Maven 依赖项的信息,请参阅为 JBoss EAP 开发 Web 服务应用中的 YAML 提供程序 。
Content-Type Header 中的默认 Charset UTF-8
自 JBoss EAP 7.1 起,resteasy.add.charset 参数默认设置为 true。如果您不希望 RESTEasy 将 restarset =UTF-8 添加到返回的 content-type 标头中,当资源方法返回 text/* 或 介质类型而无需显式 charset 时,您可以将 resteasy.add.charset 参数设置为application/xml* false。
如需有关文本媒体类型和字符集的更多信息,请参阅为 JBoss EAP 开发 Web 服务应用中的 https://access.redhat.com/documentation/en-us/red_hat_jboss_enterprise_application_platform/7.3/html-single/developing_web_services_applications/#text_media_types_charsets 文本介质类型和字符集。
SerializableProvider
从不受信任的来源对 Java 对象进行序列化是不安全的。因此,在 JBoss EAP 7 中,org.jboss.resteasy.plugins.providers.SerializableProvider 类默认为禁用,不建议使用此提供程序。
将请求与资源方法匹配
在 RESTEasy 3 中,对匹配规则的实施进行了改进和更正,如 JAX-RS 规范中所定义。特别是,对如何处理子资源方法上的模糊 URI 以及子资源定位器进行了更改。
在 RESTEasy 2 中,即使存在另一个具有相同 URI 的子资源,子资源定位器也能成功执行。根据规范,此行为不正确。
在 RESTEasy 3 中,当子资源和子资源定位器存在模糊的 URI 时,调用子资源会成功;但是,调用子资源定位器将导致 HTTP 状态 405 Method Not Allowed 错误。
以下示例包含子资源 方法上的模糊 @Path 注释和子资源定位器:注意两个端点( anotherResource 和 的 URI 都相同。这两个端点之间的区别在于,anotherResource Locator)另一个Resource 方法与 REST 动词 POST 关联。anotherResourceLocator 方法不与任何 REST 动词关联。根据规范,使用 REST 动词的端点(在本例中为 anotherResource 方法)始终会被选择。
@Path("myResource")
public class ExampleSubResources {
@POST
@Path("items")
@Produces("text/plain")
public Response anotherResource(String text) {
return Response.ok("ok").build();
}
@Path("items")
@Produces("text/plain")
public SubResource anotherResourceLocator() {
return new SubResource();
}
}
资源方法算法切换
3.0.25 之前的 RESTEasy 3.0.x 版本中使用的资源方法匹配算法中发现了一个错误。Final 会导致 RESTEasy 在响应请求时返回太多资源方法。
匹配算法有三个阶段:
- 使用请求路径选择可能的资源类。
- 使用请求路径选择可能的资源方法。
- 使用 HTTP 动词和介质类型(即将推出)选择最终资源方法。
根据 JAX-RS 2.0 规范,在对潜在资源方法集进行排序后,应当仅将 maximal 元素传递到第 3 步。但是,RESTEasy 3.0.x 实施在 RESTEasy 3.0.25 之前通过所有方法传递到第 3 步。JBoss EAP 7.1.0 中包含的 RESTEasy 3.0.24 显示了这种不正确的行为。
JBoss EAP 7.1.1 中包含的 RESTEasy 3.0.25 提供了相应的修复,以限制为第 3 步传递的方法以符合 JAX-RS 2.0 规范的要求。由于松散行为可能更为可取,因此 RESTEasy 3.0.25 还引入了 context-param 配置选项 resteasy.loose.step2.request.matching( 默认为 false ),可以将其配置为启用旧行为。
如果您将 JBoss EAP 服务器从 7.1.0 更新至 7.1.1,并且您想要保留旧行为并将所有潜在资源方法传递给第 3 步,请将 resteasy.loose.step2.request.matching 选项 设置为 true。
JAX-RS 2.1 规范中更改了匹配的算法,将所有匹配资源方法传递到第 3 步。JBoss EAP 7.3 中包含的 RESTEasy 3.9.0 提供了 jaxrs.2.0.request.matching 选项,以保持 JAX-RS 2.0 规范中定义的更严格行为。
如果您将应用从 JBoss EAP 从 7.1.0 迁移到 7.2.x,则资源方法匹配算法的行为不应发生变化。如果您将您的应用从 7.1.1 迁移到 7.2.x 或更高的版本,并希望保留 JAX-RS 2.0 规范中定义的更严格行为,请将 jaxrs.2.0.request.matching 选项设置为 true。