2010-01-07 36 views
3

我试图设置Jetty来提供压缩的html内容。在web.xml中,我设置GzipFilter并将其映射到/ *,但这似乎不起作用。这里的过滤器配置:在Jetty中设置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,所以解决方案可能会非常简单。如果您可以将我链接到可能帮助我的文档,那也会很棒。

回答

0

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

+1

我终于有时间回到这个问题。我没有收到任何错误。但是我没有看到实际发生的任何gzip。我如何检查过滤器是否实际运行? – Misha 2010-09-27 17:30:16

+0

@Misha,你可以使用TCP数据包跟踪软件,或使用一些在线工具检查,如http://www.gidnetwork.com/tools/gzip-test.php – spektom 2011-06-19 13:21:40

-1

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

3

GZIP压缩

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

静态内容

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

GzipFilter

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

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

从码头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

有时使用Gzipfilter存在一些问题,这取决于你是如何处理的缓冲区并冲洗。因此,使用org.eclipse.jetty.servlets.IncludableGzipFilter(实际上是一个扩展GzipFilter)可以解决你的问题。

3

我也要回答这个问题,因为我已经做了大量的工作,我终于做到了。另外,我并不是HTTP细节方面的专家,所以我会给出非专业的答案。

首先,我是如何检查我的GZipFilter是否工作。开始使用Firefox,确保我拥有Firebug插件,启动Firebug插件,进入“网络”选项卡。然后我访问了应该返回GZip的响应的URL。下面是萤火虫显示:

enter image description here

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

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

经过多次试验和错误,我所做的是在Firebug的“请求标题”部分查看“Accept”标题的值。我注意到,这里有“application/xml”和“text/xml”等值,但是我配置GZIp过滤器的初始参数“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> 

加入了“应用程序/ 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

另请注意,现在报道的响应头包含称为“内容编码”的额外字段的值“压缩”。

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

1

在码头9.3:

  1. 编辑jetty.conf,包括xml文件 “码头-gzip.xml”

  2. 编辑start.ini,并添加 “--module = servlet的”

  3. 编辑jetty-gzip.xml并配置你想要的MIME类型。

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