我只是将Web服务器从Jetty 6.x更新到了Jetty 8.0.1,由于某种原因,当我执行完全相同的请求时,有时响应已被压缩,有时却没有。

这是servlet的service()方法开始时的请求和响应:

Request: [GET /test/hello_world?param=test]@11538114 org.eclipse.jetty.server.Request@b00ec2
Response: org.eclipse.jetty.servlets.GzipFilter$2@1220fd1
WORKED!

Request:[GET /test/hello_world?param=test]@19386718 org.eclipse.jetty.server.Request@127d15e
Response:HTTP/1.1 200
Connection: close
FAILED!


这是我的GzipFilter声明:

EnumSet<DispatcherType> all = EnumSet.of(DispatcherType.ASYNC, DispatcherType.ERROR, DispatcherType.FORWARD,
            DispatcherType.INCLUDE, DispatcherType.REQUEST);
FilterHolder gzipFilter = new FilterHolder(new GzipFilter());
gzipFilter.setInitParameter("mimeTypes", "text/javascript");
gzipFilter.setInitParameter("minGzipSize", "0");
context.addFilter(gzipFilter, "/test/*", all);


Javadoc说:

GZIP Filter This filter will gzip the content of a response if:
    The filter is mapped to a matching path ==>
    The response status code is >=200 and <300
    The content length is unknown or more than the minGzipSize initParameter or the minGzipSize is 0(default)
    The content-type is in the comma separated list of mimeTypes set in the mimeTypes initParameter or if no mimeTypes are defined the content-type is not "application/gzip"
    No content-encoding is specified by the resource


在我看来,所有这些条件都符合我的情况,只是最后一个条件“资源未指定内容编码”。我该如何验证?

另外,出于我也忽略的原因,当未使用GzipFilter过滤响应时,response.getWriter()会引发IO异常。这是为什么?

最佳答案

我遇到了同样的问题,发现了2个原因:


如果您的任何servlet过早调用response.getWriter()。flush(),则GZipFilter将无法正常工作。在我的情况下,Spring MVC和Sitemesh中的Freemarker都是这样做的,因此我必须将Freemarker servlet和Spring MVC Freemarker配置对象的Freemarker设置“ auto_flush”设置为“ false”。
如果您使用普通的GzipFilter,由于某种原因,它不允许您在Jetty的“包括”阶段中设置任何标头。所以我不得不改用IncludableGzipFilter


完成这些更改后,它对我有用。希望对您有帮助。

09-11 20:03