【问题标题】:Compressing Undertow server responses压缩 Undertow 服务器响应
【发布时间】:2015-04-02 11:05:43
【问题描述】:

我有一个程序化的 Undertow 服务器设置。静态内容也由 Undertow 提供,没有反向代理。 Undertow 启动的 Java 代码如下所示:

ResourceManager resourceManager = 
    new FileResourceManager(new File("deploymentDir"), 100);

DeploymentInfo servletBuilder = Servlets.deployment()
      .setResourceManager(resourceManager)
      .setDeploymentName("testDeployment")
      .setContextPath("/");

DeploymentManager manager = Servlets.defaultContainer()
      .addDeployment(servletBuilder);
manager.deploy();

Undertow.Builder builder = Undertow.builder();
builder.addHttpListener(8080, domainName);

PathHandler path = Handlers.path(Handlers.redirect("/"))
      .addPrefixPath("/", manager.start());

Undertow server = builder.setHandler(path).build();
server.start();

我想知道在 Undertow 中一个 gzip 服务器如何响应?

谢谢, 活力。

【问题讨论】:

    标签: java http-compression undertow


    【解决方案1】:

    我必须查看 Undertow 源代码中的 GzipContentEncodingTestCase 才能使其正常工作。必须使用适当的参数创建EncodingHandler,然后调用setNext(),以便将其链接到PathHandler

    PathHandler path = Handlers.path(Handlers.redirect("/"))
        .addPrefixPath("/", manager.start());
    
    final EncodingHandler handler = 
        new EncodingHandler(new ContentEncodingRepository()
          .addEncodingHandler("gzip", 
              new GzipEncodingProvider(), 50,
              Predicates.parse("max-content-size[5]")))
          .setNext(path);
    
    // ...
    Undertow server = builder.setHandler(handler).build();
    

    【讨论】:

      【解决方案2】:

      @siphiuel 的答案在我看来是正确的。

      但是,也可以使用 GZIP 编码创建 EncodingHandler,如下所示:

          HttpHandler pathHandler = Handlers.path(Handlers.redirect("/"))
              .addPrefixPath("/", exchange -> exchange.getResponseSender().send("echo"));
      
          HttpHandler encodingHandler = new EncodingHandler.Builder().build(null)
              .wrap(pathHandler);
      
          Undertow server = Undertow.builder()
              .addHttpListener(8080, "localhost")
              .setHandler(encodingHandler).build();
          server.start();
      

      EncodingHandler 提供了一个 HandlerBuilder,默认使用默认配置添加 GzipEncodingProvider 和 DeflateEncodingProvider。因此,您的代码没有与构造函数及其参数耦合,用于创建 EncodingHandler。

      此外,HandlerBuilder#build 返回一个 HandlerWrapper 用于流畅的 HttpHandler 包装/链接。

      【讨论】:

        【解决方案3】:

        对我个人有帮助的一个非常有趣的链接是:Add compression to Server-Sent events with Undertow。 @siphiuel提供的EncodingHandler中用到的所有参数都一一讲解。

        这里是 gzip 压缩示例的快速摘要。 addEncodingHandler(...) 的参数是:

        • 类型(“gzip”)
        • 要应用的 EncodingProvider(Undertow 提供 deflate 和 gzip 的实现)
        • 优先级(可以申请多个提供商,所以优先级将用于选择要申请的提供商)
        • 用于激活编码的谓词(在 @siphiuel 的示例中,只有内容大小 > 5 字节的响应才会被编码 - 在我分享的链接中提到了 5 KB,但我的测试证明它是 5 字节)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-08-27
          • 1970-01-01
          • 2011-06-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-01-29
          • 1970-01-01
          相关资源
          最近更新 更多