Jetty 9和GzipHandler

时间:2016-07-28 11:38:27

标签: java jetty gzip

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

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

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

此致 约翰内斯

1 个答案:

答案 0 :(得分:4)

Jetty分发解决方案

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

例如:

$ cd /path/to/mybase
$ java -jar /path/to/jetty-dist/start.jar --add-to-start=gzip

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

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

一些背景

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

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

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

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

处理程序树示例

您正在部署2个网络应用:foo.warbaz.war

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

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

当GzipHandler处于混合

时,这是服务器处理程序树
Server
  +-- .getHandler()
        +-- GzipHandler
              +-- HandlerCollection (id="Handlers")
                    +-- ContextHandlerCollection (id="Contexts")
                    |     +-- WebAppContext "/foo" (foo.war)
                    |     +-- WebAppContext "/baz" (baz.war)
                    +-- DefaultHandler
相关问题