如何为 Jetty9 启用 gzip 压缩(静态和动态)?
How to enable gzip compression (both static and dynamic) for Jetty9?
我使用 Jetty9,我想测试压缩文本文件是否会提高性能。起初我对提供离线压缩文件很感兴趣,就像在以下位置描述的那样:http://marianoguerra.org/posts/201205enable-gzip-compression-in-jetty.html
我的代码如下:
static private void set_jetty_handlers(Server server)
{
// gzip: I have added it to to serve off-line compressed JavaScript, CSS etc.
// as described at: http://marianoguerra.org/posts/201205enable-gzip-compression-in-jetty.html
ServletHolder servletHolder = new ServletHolder(new DefaultServlet());
servletHolder.setInitParameter("gzip", "true");
ServletContextHandler s_context_handler = new ServletContextHandler();
s_context_handler.addServlet(servletHolder,"/*");
ResourceHandler resource_handler = new ResourceHandler();
resource_handler.setDirectoriesListed(false);
resource_handler.setWelcomeFiles(new String[] {"index.html"});
resource_handler.setResourceBase("");
resource_handler.setCacheControl(MAX_AGE);
// gzip: I have added it to to serve offline compressed JavaScript, CSS etc.
resource_handler.setHandler(s_context_handler);
// I want to work with aliases (links and symbolic links)
ContextHandler context_handler = new ContextHandler();
context_handler.addAliasCheck(new ContextHandler.ApproveAliases());
HandlerList handlers = new HandlerList();
handlers.setHandlers(new Handler[] { new my_jetty_handler(), resource_handler, new DefaultHandler() });
context_handler.setHandler(handlers);
server.setHandler(context_handler);
configureThreadPool(server);
} // set_jetty_handlers
但是当我将 test.html
压缩为 test.html.gz
时,我得到了 HTTP ERROR: 404
。我为启用 gzip 压缩而添加的行在注释中标记为 gzip:
。
我还发现旧版本的 Jetty 有 ResourceHandler.setMinGzipLength()
。它在当前的 Jetty 版本中不可用,但从文档中它可以满足我的要求。
如何启用gzip压缩?起初我想测试静态文件压缩,但在这些测试之后我想在我的 my_jetty_handler()
中应用 GzipFilter
来提供动态内容并且也不清楚如何从 Java 代码中做到这一点。
您有多种行为,并且对上下文的工作原理理解不完整。
先举个例子:
package jetty;
import java.util.EnumSet;
import javax.servlet.DispatcherType;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.ServerConnector;
import org.eclipse.jetty.server.handler.ContextHandler;
import org.eclipse.jetty.servlet.DefaultServlet;
import org.eclipse.jetty.servlet.FilterHolder;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.servlet.ServletHolder;
import org.eclipse.jetty.servlets.GzipFilter;
import org.eclipse.jetty.util.thread.QueuedThreadPool;
import org.eclipse.jetty.util.thread.ThreadPool;
public class GzipExample
{
public static void main(String[] args)
{
ThreadPool threadPool = new QueuedThreadPool();
Server server = new Server(threadPool);
ServerConnector connector = new ServerConnector(server);
connector.setPort(8080);
server.addConnector(connector);
ServletContextHandler context = new ServletContextHandler();
context.setContextPath("/");
// Welcome files are part of the context
context.setWelcomeFiles(new String[] { "index.html" });
// Add alias check logic to context
context.addAliasCheck(new ContextHandler.ApproveAliases());
server.setHandler(context);
// Add dynamic Gzip compression, as a servlet filter
FilterHolder gzipHolder = context.addFilter(GzipFilter.class,"/*",EnumSet.of(DispatcherType.REQUEST));
gzipHolder.setInitParameter("methods","GET,POST");
// response bytes required before gzip kicks in
gzipHolder.setInitParameter("minGzipSize", "256");
// mime-types to compress (seen as response type)
gzipHolder.setInitParameter("mimeTypes", "text/plain,text/css,text/html,text/javascript");
// Add your own servlets here
context.addServlet(HelloServlet.class,"/hello/*");
// Lastly, the default servlet for resource base content (serves static files)
// It is important that this is last.
ServletHolder defHolder = new ServletHolder("default", DefaultServlet.class);
// Cannot be null or empty, must be declared, must be a directory, can be a URL to some jar content
defHolder.setInitParameter("resourceBase","./resource-base/");
defHolder.setInitParameter("dirAllowed","true");
defHolder.setInitParameter("gzip", "true");
defHolder.setInitParameter("otherGzipFileExtensions", ".svgz");
defHolder.setInitParameter("cacheControl","private, max-age=0, no-cache");
context.addServlet(defHolder,"/");
}
}
重要事项:
- ThreadPool 已设置并提供给服务器实例,并非事后配置。
ServletContextHandler
是您的上下文,它包含欢迎文件列表、上下文路径名称、别名检查、所有过滤器和 servlet。
GzipFilter
是目前的方式(这在 Jetty 9 中正在改变。3.x 到更基本的 gzip 处理机制,对 http/2 + async [=45= 更有弹性] 现实)设置动态 gzip 压缩。
GzipFilter
具有 gzip 行为的配置,包括压缩的最小字节阈值、mime 类型等...
DefaultServlet
是提供静态文件的组件,包括支持提供可选的预压缩静态文件。 (例如:客户端请求 /main.css
,表示它能够接收 gzip 压缩,默认 servlet 在您的资源库中找到 /main.css.gz
并按原样返回给请求 /main.css
的客户端)
resourceBase
是所有这些工作所必需的,定义它。
ResourceHandler
是超级基础的,并不适用于 gzip、缓存、恢复、partial/range 请求等高级概念...
- 您不能将 Jetty 处理程序与 gzip 压缩一起使用,它仅作为 servlet 层的一部分实现。 (这将随着最终的 Jetty 9.3.0 版本而改变)
我可以通过以下方式为我的处理程序添加 gzip 压缩:
GzipHandler gzipHandlerRES = new GzipHandler();
gzipHandlerRES.setMimeTypes("text/html,text/plain,text/xml,text/css,application/javascript,text/javascript");
gzipHandlerRES.setHandler(resource_handler);
它不能处理脱机压缩文件(test.html
的请求应该服务于 test.html.gz
)。
我使用 Jetty9,我想测试压缩文本文件是否会提高性能。起初我对提供离线压缩文件很感兴趣,就像在以下位置描述的那样:http://marianoguerra.org/posts/201205enable-gzip-compression-in-jetty.html
我的代码如下:
static private void set_jetty_handlers(Server server)
{
// gzip: I have added it to to serve off-line compressed JavaScript, CSS etc.
// as described at: http://marianoguerra.org/posts/201205enable-gzip-compression-in-jetty.html
ServletHolder servletHolder = new ServletHolder(new DefaultServlet());
servletHolder.setInitParameter("gzip", "true");
ServletContextHandler s_context_handler = new ServletContextHandler();
s_context_handler.addServlet(servletHolder,"/*");
ResourceHandler resource_handler = new ResourceHandler();
resource_handler.setDirectoriesListed(false);
resource_handler.setWelcomeFiles(new String[] {"index.html"});
resource_handler.setResourceBase("");
resource_handler.setCacheControl(MAX_AGE);
// gzip: I have added it to to serve offline compressed JavaScript, CSS etc.
resource_handler.setHandler(s_context_handler);
// I want to work with aliases (links and symbolic links)
ContextHandler context_handler = new ContextHandler();
context_handler.addAliasCheck(new ContextHandler.ApproveAliases());
HandlerList handlers = new HandlerList();
handlers.setHandlers(new Handler[] { new my_jetty_handler(), resource_handler, new DefaultHandler() });
context_handler.setHandler(handlers);
server.setHandler(context_handler);
configureThreadPool(server);
} // set_jetty_handlers
但是当我将 test.html
压缩为 test.html.gz
时,我得到了 HTTP ERROR: 404
。我为启用 gzip 压缩而添加的行在注释中标记为 gzip:
。
我还发现旧版本的 Jetty 有 ResourceHandler.setMinGzipLength()
。它在当前的 Jetty 版本中不可用,但从文档中它可以满足我的要求。
如何启用gzip压缩?起初我想测试静态文件压缩,但在这些测试之后我想在我的 my_jetty_handler()
中应用 GzipFilter
来提供动态内容并且也不清楚如何从 Java 代码中做到这一点。
您有多种行为,并且对上下文的工作原理理解不完整。
先举个例子:
package jetty;
import java.util.EnumSet;
import javax.servlet.DispatcherType;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.ServerConnector;
import org.eclipse.jetty.server.handler.ContextHandler;
import org.eclipse.jetty.servlet.DefaultServlet;
import org.eclipse.jetty.servlet.FilterHolder;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.servlet.ServletHolder;
import org.eclipse.jetty.servlets.GzipFilter;
import org.eclipse.jetty.util.thread.QueuedThreadPool;
import org.eclipse.jetty.util.thread.ThreadPool;
public class GzipExample
{
public static void main(String[] args)
{
ThreadPool threadPool = new QueuedThreadPool();
Server server = new Server(threadPool);
ServerConnector connector = new ServerConnector(server);
connector.setPort(8080);
server.addConnector(connector);
ServletContextHandler context = new ServletContextHandler();
context.setContextPath("/");
// Welcome files are part of the context
context.setWelcomeFiles(new String[] { "index.html" });
// Add alias check logic to context
context.addAliasCheck(new ContextHandler.ApproveAliases());
server.setHandler(context);
// Add dynamic Gzip compression, as a servlet filter
FilterHolder gzipHolder = context.addFilter(GzipFilter.class,"/*",EnumSet.of(DispatcherType.REQUEST));
gzipHolder.setInitParameter("methods","GET,POST");
// response bytes required before gzip kicks in
gzipHolder.setInitParameter("minGzipSize", "256");
// mime-types to compress (seen as response type)
gzipHolder.setInitParameter("mimeTypes", "text/plain,text/css,text/html,text/javascript");
// Add your own servlets here
context.addServlet(HelloServlet.class,"/hello/*");
// Lastly, the default servlet for resource base content (serves static files)
// It is important that this is last.
ServletHolder defHolder = new ServletHolder("default", DefaultServlet.class);
// Cannot be null or empty, must be declared, must be a directory, can be a URL to some jar content
defHolder.setInitParameter("resourceBase","./resource-base/");
defHolder.setInitParameter("dirAllowed","true");
defHolder.setInitParameter("gzip", "true");
defHolder.setInitParameter("otherGzipFileExtensions", ".svgz");
defHolder.setInitParameter("cacheControl","private, max-age=0, no-cache");
context.addServlet(defHolder,"/");
}
}
重要事项:
- ThreadPool 已设置并提供给服务器实例,并非事后配置。
ServletContextHandler
是您的上下文,它包含欢迎文件列表、上下文路径名称、别名检查、所有过滤器和 servlet。GzipFilter
是目前的方式(这在 Jetty 9 中正在改变。3.x 到更基本的 gzip 处理机制,对 http/2 + async [=45= 更有弹性] 现实)设置动态 gzip 压缩。GzipFilter
具有 gzip 行为的配置,包括压缩的最小字节阈值、mime 类型等...DefaultServlet
是提供静态文件的组件,包括支持提供可选的预压缩静态文件。 (例如:客户端请求/main.css
,表示它能够接收 gzip 压缩,默认 servlet 在您的资源库中找到/main.css.gz
并按原样返回给请求/main.css
的客户端)resourceBase
是所有这些工作所必需的,定义它。ResourceHandler
是超级基础的,并不适用于 gzip、缓存、恢复、partial/range 请求等高级概念...- 您不能将 Jetty 处理程序与 gzip 压缩一起使用,它仅作为 servlet 层的一部分实现。 (这将随着最终的 Jetty 9.3.0 版本而改变)
我可以通过以下方式为我的处理程序添加 gzip 压缩:
GzipHandler gzipHandlerRES = new GzipHandler();
gzipHandlerRES.setMimeTypes("text/html,text/plain,text/xml,text/css,application/javascript,text/javascript");
gzipHandlerRES.setHandler(resource_handler);
它不能处理脱机压缩文件(test.html
的请求应该服务于 test.html.gz
)。