使用GZIPContentEncodingFilter时,为什么我的响应没有压缩

时间:2012-10-25 15:55:55

标签: json rest jersey gzip

我有一个REST方法,我想输出gziped内容。我添加了

 <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。我正在使用Jersey 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();

    }

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分: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 /做什么响应压缩。例如。在您的server.xml的连接器(Tomcat 7)中压缩=“on”。