泽西2 / Grizzly的GZIP编码

时间:2013-11-03 08:11:33

标签: jersey gzip grizzly

我无法在Jersey服务中激活gzip-encoding。这就是我尝试过的:

  1. 开始使用Getting Started Guide中的jersey-quickstart-grizzly2原型。

  2. 添加了rc.register(org.glassfish.grizzly.http.GZipContentEncoding.class);

    (还试过rc.register(org.glassfish.jersey.message.GZipEncoder.class);

  3. mvn exec:java

  4. 开始
  5. 使用curl --compressed -v -o - http://localhost:8080/myapp/myresource

  6. 进行测试

    结果如下:

    > GET /myapp/myresource HTTP/1.1
    > User-Agent: curl/7.22.0 (x86_64-pc-linux-gnu) libcurl/7.22.0 zlib/1.2.3.4 ...
    > Host: localhost:8080
    > Accept: */*
    > Accept-Encoding: deflate, gzip
    > 
    < HTTP/1.1 200 OK
    < Content-Type: text/plain
    < Date: Sun, 03 Nov 2013 08:07:10 GMT
    < Content-Length: 7
    < 
    * Connection #0 to host localhost left intact
    * Closing connection #0
    Got it!
    

    即使请求中有Accept-Encoding: deflate, gzip,响应中也没有Content-Encoding: gzip

    我在这里缺少什么?

2 个答案:

答案 0 :(得分:12)

您还必须注册org.glassfish.jersey.server.filter.EncodingFilter。此示例启用deflategzip压缩:

import org.glassfish.jersey.message.DeflateEncoder;
import org.glassfish.jersey.message.GZipEncoder;
import org.glassfish.jersey.server.ResourceConfig;
import org.glassfish.jersey.server.filter.EncodingFilter;
...
private void enableCompression(ResourceConfig rc) {
    rc.registerClasses(
            EncodingFilter.class,
            GZipEncoder.class,
            DeflateEncoder.class);
}

此解决方案特定于球衣,不仅适用于Grizzly,也适用于JDK Http服务器。

答案 1 :(得分:9)

尝试以下代码:

HttpServer httpServer = GrizzlyHttpServerFactory.createHttpServer(
        BASE_URI, rc, false);

CompressionConfig compressionConfig =
        httpServer.getListener("grizzly").getCompressionConfig();
compressionConfig.setCompressionMode(CompressionConfig.CompressionMode.ON); // the mode
compressionConfig.setCompressionMinSize(1); // the min amount of bytes to compress
compressionConfig.setCompressableMimeTypes("text/plain", "text/html"); // the mime types to compress

httpServer.start();