0

我有一个 REST 方法,我想在其中输出 gzip 压缩的内容。我已经添加了

 <init-param>
         <param-name>com.sun.jersey.spi.container.ContainerResponseFilters</param-name>
         <param-value>com.sun.jersey.api.container.filter.GZIPContentEncodingFilter</param-value>
     </init-param>

到 web.xml 中的 servlet

我可以看到代码通过调试通过 GZIPContentEncodingFilter 类,但输出没有得到 .gzip 前缀并且内容没有被压缩,而是正常的 json。我正在使用泽西岛 1.14。

方法如下:

@GET
    @Path("/fundlight")
    @Produces(MediaType.APPLICATION_JSON)
    public Response getFundLightList() {

        StopWatch watch = new StopWatch();
        watch.start();

        Collection<Object> objectResults = null;

        objectResults = getCacheMap("FundLight").values();
        List<FundLight> fundLightList = new ArrayList(objectResults);

        watch.stop();

        GenericEntity<List<FundLight>> entity = new GenericEntity<List<FundLight>>(fundLightList) {
        };


         ResponseBuilder builder = Response.ok(entity);
         return builder.build();

    }
4

2 回答 2

3

我认为这取决于客户端请求标头参数。
如果请求包含包含“gzip”的 Accept-Encoding 标头, 则使用 gzip 压缩响应实体(如果有)并将“gzip”的 Content-Encoding 标头添加到响应中。

请参阅:http: //jersey.java.net/nonav/apidocs/latest/jersey/com/sun/jersey/api/container/filter/GZIPContentEncodingFilter.html

于 2013-01-17T10:33:47.180 回答
0

最简单的方法是注册 GZIPEncoder 和 EncodingFilter:

public class MyApplication extends Application {
    @Override
    public Set<Class<?>> getClasses() {
        final Set<Class<?>> classes = new HashSet<>();

        classes.add(GZipEncoder.class); // this allows gzipped requests and responses
        classes.add(EncodingFilter.class); // this enables any registered encoders

        return classes;
    }
}

现在您的服务器端可以使用“Content-Encoding:gzip”处理请求,并在客户端请求的标头具有“Accept-Encoding:gzip”时响应 gzip。

您还可以通过配置告诉您的 tomcat/apache/whatever 响应压缩。例如。在 server.xml 的连接器(Tomcat 7)中压缩 =“on”。

于 2015-06-30T12:15:57.023 回答