【问题标题】:Problem setting up GzipFilter in Jetty在 Jetty 中设置 GzipFilter 的问题
【发布时间】:2010-01-07 15:48:12
【问题描述】:

我正在尝试设置 Jetty 以提供压缩的 html 内容。在 web.xml 中,我设置了 GzipFilter 并将其映射到 /* 但这似乎不起作用。这是过滤器配置:

<filter>
 <filter-name>GZipFilter</filter-name>
 <display-name>Jetty's GZip Filter</display-name>
 <description>Filter that zips all the content on-the-fly</description>
 <filter-class>org.mortbay.servlet.GzipFilter</filter-class>
 <init-param>
  <param-name>mimeTypes</param-name>
  <param-value>text/html</param-value>
 </init-param>
</filter>

<filter-mapping>
 <filter-name>GZipFilter</filter-name>
 <url-pattern>/*</url-pattern>
</filter-mapping>

我刚开始使用 Jetty,所以解决方案可能非常简单。如果您可以将我链接到可能对我有帮助的文档,那也很棒。

【问题讨论】:

    标签: filter gzip jetty


    【解决方案1】:

    GZIP 压缩

    GZIP 压缩可用于减少“通过网络”发送的数据量。压缩作为传输编码应用。这可以极大地提高 web 应用程序的性能,但是它也会消耗更多的 CPU,并且某些内容(例如图像)不能很好地压缩。

    静态内容

    Jetty 默认 Servlet 可以将预压缩的静态内容作为传输编码提供服务,并避免动态压缩的开销。如果“gzip”初始化参数设置为 true,那么 Jetty 将寻找压缩的静态资源。因此,如果收到对“foo.txt”的请求并且文件“foo.txt.gz”存在,那么它将作为“foo.txt”使用 gzip 传输编码。

    GzipFilter

    Jetty Gzip 过滤器是一种压缩过滤器,几乎可以应用于任何动态资源(servlet)。它修复了常用压缩过滤器中的许多错误(例如处理可能设置内容长度的所有方式),并且一直在使用 Jetty 延续和暂停请求进行测试。

    一些用户代理可能会被排除在压缩之外,以避免一些常见的浏览器错误(是的,这意味着 IE!)。

    参考码头文档: http://docs.codehaus.org/display/JETTY/GZIP+Compression

    你可以看看 Gzipfilter 源代码,这里有很多有用的 cmets : http://download.eclipse.org/jetty/stable-7/xref/org/eclipse/jetty/servlets/GzipFilter.html

    【讨论】:

      【解决方案2】:

      我也会回答这个问题,因为我一直在努力解决这个问题,但我终于做到了。另外,我不是 HTTP 细节方面的主要专家,所以我会给出一个非专业的答案。

      首先,这是我检查 GZipFilter 是否正常工作的方法。启动 Firefox,确保我有 Firebug 插件,启动 Firebug 插件,转到“网络”选项卡。然后我访问了应该返回 GZipped 响应的 URL。以下是 Firebug 显示的内容:

      “大小”列显示响应的大小。如果您将鼠标悬停在“大小”列标签上,它会告诉您如果响应被压缩,那么它将显示响应的压缩大小。

      这一切都是在 Jetty 中启用 GZip 过滤器完成的。然后我从我的 web.xml 中删除了 GZip 过滤器声明,重新启动了 Jetty 并重复了测试。这次响应的大小与之前完全相同,这清楚地表明 GZip 压缩不起作用。

      经过多次试验和错误,我所做的是在 Firebug 中的“请求标头”部分查看“接受”标头的值。我注意到这里有“application/xml”和“text/xml”之类的值,但是我配置 GZIp 过滤器的 init 参数“mimeTypes”的方式只包含“text/xml”(并且缺少“application /xml”)。它是这样配置的:

      <filter>
            <filter-name>GzipFilter</filter-name>
            <filter-class>org.eclipse.jetty.servlets.GzipFilter</filter-class>
            <init-param>
              <param-name>mimeTypes</param-name>  
              <param-value>text/html,text/plain,text/xml,application/xhtml+xml,text/css,application/javascript,image/svg+xml,application/json,application/xml; charset=UTF-8</param-value>
            </init-param>
          </filter>
          <filter-mapping>
            <filter-name>GzipFilter</filter-name>
            <url-pattern>/*</url-pattern>
          </filter-mapping>
      

      将“application/xml”值添加到列表后,如下所示:

      <filter>
            <filter-name>GzipFilter</filter-name>
            <filter-class>org.eclipse.jetty.servlets.GzipFilter</filter-class>
            <init-param>
              <param-name>mimeTypes</param-name>  
              <param-value>text/html,text/plain,text/xml,application/xhtml+xml,application/xml,text/css,application/javascript,image/svg+xml,application/json,application/xml; charset=UTF-8</param-value>
            </init-param>
          </filter>
          <filter-mapping>
            <filter-name>GzipFilter</filter-name>
            <url-pattern>/*</url-pattern>
          </filter-mapping>
      

      我重新进行了之前的测试,果然现在报告的响应大小要小得多:

      另外请注意,现在报告的响应标头包含一个名为“Content-Encoding”的额外字段,其值为“gzip”。

      所以基本上这个想法是检查您在请求“接受”标头中发送的值类型,并确保所有这些值都在 GZip 过滤器的“mimeTypes”初始化参数中配置。

      【讨论】:

        【解决方案3】:

        有时使用 Gzipfilter 会出现一些问题,这取决于您处理缓冲区和刷新的方式。因此,使用 org.eclipse.jetty.servlets.IncludableGzipFilter(实际上是扩展 GzipFilter)可能会解决您的问题。

        【讨论】:

          【解决方案4】:

          在码头 9.3:

          1. 编辑 jetty.conf 并包含 xml 文件“jetty-gzip.xml”

          2. 编辑 start.ini 并添加“--module=servlets”

          3. 编辑 jetty-gzip.xml 并配置所需的 mime 类型。

          4. 重启jetty并再次测试。

          【讨论】:

            【解决方案5】:

            错误是什么?您是否遇到类路径问题或其他问题?如果是类路径,则需要确保 gzipfilter 类可用于码头运行时,否则它将死亡。

            【讨论】:

            • 我终于有时间回到这个问题了。我没有收到任何错误。但我没有看到任何 gzipping 实际发生。如何检查过滤器是否实际运行?
            • @Misha,您可以使用 TCP 数据包跟踪软件,也可以使用一些在线工具检查,例如 gidnetwork.com/tools/gzip-test.php
            【解决方案6】:

            您是否发送带有“Content-Encoding: gzip”请求标头的请求?

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2011-11-22
              • 2017-01-05
              • 2014-03-12
              • 2015-06-21
              • 2019-04-17
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多