Jetty 9 和 GzipHandler

Joh*_*nes 2 java gzip jetty

我正在尝试配置 Jetty 9 服务器来提供 Gzip 压缩数据。不幸的是,我找不到任何适合我的用例的描述。我想我必须使用新的 GzipHandler 而不是 GzipFilter (从 Jetty 9.3 开始,GzipFilter 只是一个虚拟的)。

我的设置是一个 WAR 文件,部署在 Jetty 9 安装上或由 maven-jetty-plugin 运行。所以这不是嵌入式 Jetty。目前我只有一个jetty-env.xmlin /src/main/resources/META-INF/resources/WEB-INF. 没有其他 Jetty 相关的配置文件。我希望有一个不需要对 Jetty 安装进行任何更改的设置。因此,应该可以通过 WAR 文件中的附加配置来启用压缩。我还喜欢压缩静态(来自/src/main/resources/Webjar 的文件)和动态(由 Jersey 生成)内容。

我希望有人已经完成了这样的设置并可以给我一些提示。

问候,约翰内斯

Joa*_*elt 5

Jetty 分发解决方案

如果使用jetty-distribution,请将gzip模块添加到您的配置中${jetty.base}

例如:

$ cd /path/to/mybase
$ java -jar /path/to/jetty-dist/start.jar --add-to-start=gzip
Run Code Online (Sandbox Code Playgroud)

您现在已将其添加GzipHandler到服务器的配置中。

查看您的/path/to/mybase/start.ini配置选项的内容。

一些背景

自从引入 Servlet 3.1 及其带来的新 Async I/O 功能后,GzipFilter基于方法不再可行。

Jetty 中 Gzip 支持的实现现在基于容器 HTTP 输出拦截器模式。这意味着GzipHandler必须在您的 WebApp 及其WebAppContext存在之前在 Jetty Handler 树中的某个点进行定义。

这也意味着您无法添加GzipHandlerviaWEB-INF/web.xml或 WAR 文件中包含的任何内容,因为这在服务器的生命周期中添加GzipHandler.

无法从嵌入的文件中GzipHandler 安全地WEB-INF/jetty-web.xml添加,因为这WebAppContext是您可以从该文件安全地操作的唯一内容。

处理程序树示例

您有 2 个正在部署的 Web 应用程序:foo.warbaz.war

这是不使用 Gzip 时的服务器处理程序树...

$ cd /path/to/mybase
$ java -jar /path/to/jetty-dist/start.jar --add-to-start=gzip
Run Code Online (Sandbox Code Playgroud)

这是混合 GzipHandler 时的服务器处理程序树

Server
  +-- .getHandler()
        +-- HandlerCollection (id="Handlers")
              +-- ContextHandlerCollection (id="Contexts")
              |     +-- WebAppContext "/foo" (foo.war)
              |     +-- WebAppContext "/baz" (baz.war)
              +-- DefaultHandler
Run Code Online (Sandbox Code Playgroud)