以编程方式设置Jetty GzipHandler

时间:2014-07-02 01:08:08

标签: http compression jetty embedded-jetty

我正在使用Jetty GzipHandler,它似乎工作得相当奇怪:它只压缩已压缩的文件。

我的整个设置是

GzipHandler gzipHandler = new GzipHandler();
gzipHandler.setHandler(myHandler);
server.setHandler(gzipHandler);

浏览器(Chromium)始终发送包含

的标头
Accept-Encoding:gzip,deflate,sdch

所以根据文件

  

GZIP Handler如果出现以下情况,此处理程序将gzip响应的内容:

     
      
  • 过滤器映射到匹配路径
  •   
  • 响应状态代码是> = 200且<300
  •   
  • 内容长度未知或超过minGzipSize initParameter或minGzipSize为0(默认值)
  •   
  • 内容类型位于mimeTypes initParameter中设置的逗号分隔的mimeTypes列表中,或者如果未定义mimeTypes,则content-type不是“application / gzip”
  •   
  • 资源
  • 未指定内容编码   

它应该适用于两者。我只是不确定path部分,但没有指明任何部分,我希望它对两者都有效,或者两者都没有。

我使用window.location.reload(true)来强制重新加载。标题相当长,所以我将它们链接起来:csspng

我试图设置一些属性,但没有任何成功。我应该找到吗? jetty-servlets-9.1.3.v20140225-sources.jar,我会调试它。问题是:为什么GzipHandler决定只压缩压缩文件?这是完全确定的:jpgpng得到压缩(无论多小),没有其他文件。

更新

通过setMimeTypes我可以排除图像。我调试它,我仍然没有线索,为什么其他静态资源永远不会被压缩。我仔细检查myHandler是否统一对待它们(它们都直接来自预先计算的Map<String, byte[]>)。

3 个答案:

答案 0 :(得分:8)

以下是我在Jetty 9.3.7中配置GzipHandler的方法:

GzipHandler gzipHandler = new GzipHandler();
gzipHandler.setIncludedMimeTypes("text/html", "text/plain", "text/xml", 
            "text/css", "application/javascript", "text/javascript");
gzipHandler.setHandler(myHandler);
handlerList.addHandler(gzipHandler);

在这种情况下,myHandlerResourceHandler的一个实例。默认情况下,Gzip处理程序仅对GET个请求进行gzip响应,响应代码为200范围。

答案 1 :(得分:2)

我们可以使用GzipFilter来实现这个结果。 GzipFilter的Jetty文档提供了许多详细信息支持的参数列表。要以编程方式启用它,refer this question

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>

答案 2 :(得分:1)

对于出现的下一个人,以下是启用请求解压缩的方法,其中ev_SS是扩展handler的类。请求解压缩的重要部分是org.eclipse.jetty.server.handler.AbstractHandler(仅默认为includeMethods)和GET(需要大于0但默认为0)。代码:

inflateBuffer