5

我有一个 RestEasy + Java EE 应用程序。当我将@GZIP 添加到组件类时,如果客户端发送“accepts:gzip”,则服务器答案会被压缩

有没有办法为所有组件启用 gzip?我不喜欢将注释添加到每个班级。

我正在使用 RestEasy JAX-RS 3.0.1

4

5 回答 5

1

如果你在一个接口后面实现你的 API,那么你的所有接口都可能从一个接口继承,让我们命名为“BaseAPI”,如果你在 BaseAPI 上设置@Gzip,那么它会为所有继承的接口和方法应用 Content-Encoding。

@GZIP
public interface BaseAPI
{
}


public interface APIX extends BaseAPI
{
   @GET
   Response getSomething() {
}
于 2014-10-17T10:27:54.633 回答
0

不,注释无法为所有资源启用 gzip。如果您想放弃为每个类添加注释,您可以创建一个 servlet 过滤器,该过滤器查看传入的标头并在输出时压缩响应。

于 2013-07-25T14:40:18.903 回答
0

您可以使用自定义的 JAX-RS 2.0 过滤器和拦截器来做到这一点,一旦您知道如何操作,这甚至不是特别难。

您需要做的是添加一个过滤器来修改 GZIP 的现有过滤器,因此它不会检查是否存在注释以支持编码,它只会查找 Accept-Encoding 标头。

看看 RestEasy GZIP 编码是如何实现的: https ://github.com/resteasy/Resteasy/tree/master/jaxrs/resteasy-jaxrs/src/main/java/org/jboss/resteasy/plugins/interceptors/encoding

您需要添加具有始终添加 GZIP 过滤器的方法的功能configure(ResourceInfo resourceInfo, FeatureContext configurable)无论是否存在注释。您将需要一项为服务器注册自定义过滤器的功能,以及一项为客户端注册的功能。

有了这些,现有的 GZIP 拦截器就应该完成剩下的工作。

我使用类似的机制来创建自定义压缩过滤器(尽管我最终将其设置为通过注释应用以限制范围)。

于 2014-03-08T18:38:12.183 回答
0

Reasteasy 有这个 GZIPDecodingInterceptor。因此,您可以在创建客户端时执行此操作:

import org.jboss.resteasy.plugins.interceptors.GZIPDecodingInterceptor;
import org.jboss.resteasy.client.jaxrs.internal.ResteasyClientBuilderImpl;

ResteasyClient client = new ResteasyClientBuilderImpl().build();
client.register(GZIPDecodingInterceptor.class);
于 2021-04-27T15:52:30.190 回答
0

为此使用 Apache。Apache 可以自动处理它并优化(在您的情况下为 gzip)您对客户端的所有响应。它不仅会 gzip 它,还会附加所有必要的响应头,允许客户端识别,内容是 zippid 让他们解压缩。

此问题无需更改代码。

于 2019-08-09T07:11:23.877 回答