在Jetty中设置GzipFilter时出现问题

时间:2010-01-07 15:48:13

标签: filter gzip jetty

我正在尝试设置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,因此解决方案可能非常简单。如果您可以将我链接到可能对我有帮助的文档,那也会很棒。

6 个答案:

答案 0 :(得分:3)

GZIP压缩

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

静态内容

Jetty默认Servlet可以将预压缩的静态内容作为传输编码提供,并避免了即时压缩的费用。如果“gzip”init参数设置为true,那么Jetty将查找压缩的静态资源。因此,如果收到“foo.txt”请求并且文件“foo.txt.gz”存在,则它将作为“foo.txt”使用gzip传输编码。

<强> GzipFilter

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

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

参考jetty doc: http://docs.codehaus.org/display/JETTY/GZIP+Compression

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

答案 1 :(得分:3)

我也会回答这个问题,因为我试图让这项工作变得非常糟糕,我终于做到了。另外,我不是HTTP细节的主要专家,所以我会给出一个非专业的答案。

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

enter image description here

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

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

经过多次试验和错误后,我所做的就是在“请求标题”部分查看Firebug,以查看“Accept”标题的值。我注意到这里有像“application / xml”和“text / xml”这样的值,但是我配置我的GZIp过滤器的init参数“mimeTypes”的方式只包含“text / xml”(并且缺少“应用程序”) / 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>

我重新编写了我之前的测试,现在确定报告的响应大小要小得多:

enter image description here

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

所以基本上我的想法是检查你在Request“Accept”标题中发送的值的类型,并确保在GZip过滤器的“mimeTypes”init参数中配置了所有这些值。

答案 2 :(得分:1)

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

答案 3 :(得分:1)

在码头9.3:

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

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

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

  4. 重新启动jetty并再次测试。

答案 4 :(得分:0)

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

答案 5 :(得分:-1)

您是否使用“Content-Encoding:gzip”请求标头发送请求?