您建议使用哪种压缩(GZIP最受欢迎)servletfilter?

我正在寻找一个GZIP servletfilter,用于高容量的web应用程序。 我不想使用特定于容器的选项。

需求

  1. 能够压缩响应有效负载(XML)
  2. 更快
  3. 适用于大批量应用的生产中
  4. 应正确设置适当的Content-Encoding
  5. 便携式跨容器
  6. 可选择解压缩请求

谢谢。

从我所看到的,大多数人通常使用gzip压缩filter。 通常来自ehcache 。

GZIPfilter实现是: net.sf.ehcache.constructs.web.filter.GzipFilter

在项目中包含它的Maven坐标是:

 net.sf.ehcache ehcache-web 2.0.4  

您还需要指定SLF4J日志记录目标。 如果您不知道这是什么或不关心slf4j-jdk14或slf4j-simple工作原理:

  org.slf4j slf4j-jdk14 1.6.4  

我用来压缩webapps资源的GZIPfilter:

 public class CompressionFilter implements Filter { public void destroy() { } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest httpRequest = (HttpServletRequest) request; HttpServletResponse httpResponse = (HttpServletResponse) response; String acceptEncoding = httpRequest.getHeader(HttpHeaders.ACCEPT_ENCODING); if (acceptEncoding != null) { if (acceptEncoding.indexOf("gzip") >= 0) { GZIPHttpServletResponseWrapper gzipResponse = new GZIPHttpServletResponseWrapper(httpResponse); chain.doFilter(request, gzipResponse); gzipResponse.finish(); return; } } chain.doFilter(request, response); } public void init(FilterConfig filterConfig) throws ServletException { } } public class GZIPHttpServletResponseWrapper extends HttpServletResponseWrapper { private ServletResponseGZIPOutputStream gzipStream; private ServletOutputStream outputStream; private PrintWriter printWriter; public GZIPHttpServletResponseWrapper(HttpServletResponse response) throws IOException { super(response); response.addHeader(HttpHeaders.CONTENT_ENCODING, "gzip"); } public void finish() throws IOException { if (printWriter != null) { printWriter.close(); } if (outputStream != null) { outputStream.close(); } if (gzipStream != null) { gzipStream.close(); } } @Override public void flushBuffer() throws IOException { if (printWriter != null) { printWriter.flush(); } if (outputStream != null) { outputStream.flush(); } super.flushBuffer(); } @Override public ServletOutputStream getOutputStream() throws IOException { if (printWriter != null) { throw new IllegalStateException("printWriter already defined"); } if (outputStream == null) { initGzip(); outputStream = gzipStream; } return outputStream; } @Override public PrintWriter getWriter() throws IOException { if (outputStream != null) { throw new IllegalStateException("printWriter already defined"); } if (printWriter == null) { initGzip(); printWriter = new PrintWriter(new OutputStreamWriter(gzipStream, getResponse().getCharacterEncoding())); } return printWriter; } @Override public void setContentLength(int len) { } private void initGzip() throws IOException { gzipStream = new ServletResponseGZIPOutputStream(getResponse().getOutputStream()); } } public class ServletResponseGZIPOutputStream extends ServletOutputStream { GZIPOutputStream gzipStream; final AtomicBoolean open = new AtomicBoolean(true); OutputStream output; public ServletResponseGZIPOutputStream(OutputStream output) throws IOException { this.output = output; gzipStream = new GZIPOutputStream(output); } @Override public void close() throws IOException { if (open.compareAndSet(true, false)) { gzipStream.close(); } } @Override public void flush() throws IOException { gzipStream.flush(); } @Override public void write(byte[] b) throws IOException { write(b, 0, b.length); } @Override public void write(byte[] b, int off, int len) throws IOException { if (!open.get()) { throw new IOException("Stream closed!"); } gzipStream.write(b, off, len); } @Override public void write(int b) throws IOException { if (!open.get()) { throw new IOException("Stream closed!"); } gzipStream.write(b); } } 

您还需要在web.xml中定义映射:

  CompressionFilter com.my.company.CompressionFilter   CompressionFilter *.js   CompressionFilter *.css   CompressionFilter *.html   CompressionFilter *.jsp  

查看pjl-comp-filter CompressingFilter:

http://sourceforge.net/projects/pjl-comp-filter/

我建议你在tomcat前面使用一些东西来卸载gzipping。 使用mod_deflate的Apache将表现良好。 您可以选择将apache放在同一个盒子上,或者将其移到另一个盒子上,这样压缩根本不会影响您的应用程序。 mod_jk或mod_proxy在这个设置中都可以正常工作。

http://httpd.apache.org/docs/2.0/mod/mod_deflate.html

或者,如果您在前面使用Nginx,请参阅此处: http : //nginx.org/en/docs/http/ngx_http_gzip_module.html 。 但绝对是,正如Zeki所说,最好将其转移到专用的Web服务器上。