Quale filtro di servlet di compressione (è GZIP il più popolare) suggeriresti?

Sto cercando un filtro servlet GZIP da utilizzare in un’app web ad alto volume. Non voglio usare le opzioni specifiche del contenitore.

Requisiti

  1. Capacità di comprimere il payload della risposta (XML)
  2. Più veloce
  3. Collaudato in produzione per applicazioni ad alto volume
  4. Dovrebbe impostare correttamente la codifica del contenuto appropriata
  5. portatile attraverso i contenitori
  6. Opzionalmente in grado di decomprimere la richiesta

Grazie.

Da quello che ho visto, la maggior parte delle persone usa generalmente il filtro di compressione gzip. Tipicamente da ehcache .

L’implementazione del filtro GZIP è: net.sf.ehcache.constructs.web.filter.GzipFilter

Il coordinatore Maven per includerlo nel tuo progetto è:

 net.sf.ehcache ehcache-web 2.0.4  

Sarà inoltre necessario specificare un objective di registrazione SLF4J. Se non sai di cosa si tratta o non ti interessa i lavori di slf4j-jdk14 o slf4j-semplici:

  org.slf4j slf4j-jdk14 1.6.4  

Il filtro GZIP che utilizzo per comprimere le risorse nelle mie applicazioni web:

 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); } } 

Devi anche definire la mapping nel tuo web.xml:

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

Guarda il filtro compressore pjl-comp-filter:

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

Ti consiglio di utilizzare qualcosa di fronte a Tomcat per scaricare gzipping. Apache con mod_deflate funzionerà bene. Hai la possibilità di mettere apache sulla stessa scatola o spostarlo in una casella diversa, in questo modo la compressione non ha alcun impatto sull’app. mod_jk o mod_proxy funzioneranno entrambi bene in questa configurazione.

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

O se stai usando Nginx in primo piano, vedi qui: http://nginx.org/en/docs/http/ngx_http_gzip_module.html . Ma sicuramente, come ha detto Zeki, è meglio spostarlo sul server web dedicato.