我也会回答这个问题,因为我一直在努力解决这个问题,但我终于做到了。另外,我不是 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”初始化参数中配置。