压缩 Undertow 服务器响应
Compressing Undertow server responses
我有一个程序化的 Undertow 服务器设置。静态内容也由 Undertow 提供,没有反向代理。 Java Undertow 启动代码如下所示:
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();
我想知道一台 gzip 服务器在 Undertow 中如何响应?
谢谢,
维塔利.
我必须查看 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();
一个对我个人有帮助的非常有趣的 link 是:Add compression to Server-Sent events with Undertow。
@siphiuel提供的EncodingHandler中用到的所有参数都一一解释
这里是一个 gzip 压缩示例的快速总结。 addEncodingHandler(...)
的参数将是:
- 类型(“gzip”)
- 要应用的 EncodingProvider(Undertow 提供 deflate 和 gzip 的实现)
- 优先级(可以申请多个供应商,所以会根据优先级来选择供应商申请)
- 用于激活编码的谓词(在@siphiuel 的示例中,只有内容大小大于 5 字节的响应才会被编码 - 在 link 我分享的内容中提到了 5 KB,但我的测试证明它是 5字节)。
@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 returns 用于流畅的 HttpHandler 的 HandlerWrapper wrapping/chaining。
我有一个程序化的 Undertow 服务器设置。静态内容也由 Undertow 提供,没有反向代理。 Java Undertow 启动代码如下所示:
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();
我想知道一台 gzip 服务器在 Undertow 中如何响应?
谢谢, 维塔利.
我必须查看 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();
一个对我个人有帮助的非常有趣的 link 是:Add compression to Server-Sent events with Undertow。 @siphiuel提供的EncodingHandler中用到的所有参数都一一解释
这里是一个 gzip 压缩示例的快速总结。 addEncodingHandler(...)
的参数将是:
- 类型(“gzip”)
- 要应用的 EncodingProvider(Undertow 提供 deflate 和 gzip 的实现)
- 优先级(可以申请多个供应商,所以会根据优先级来选择供应商申请)
- 用于激活编码的谓词(在@siphiuel 的示例中,只有内容大小大于 5 字节的响应才会被编码 - 在 link 我分享的内容中提到了 5 KB,但我的测试证明它是 5字节)。
@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 returns 用于流畅的 HttpHandler 的 HandlerWrapper wrapping/chaining。