, Но определенно, как сказал Зеки, лучше перенести это на выделенный веб-сервер.

фильтр сервлетов GZIP, который будет использоваться в веб-приложении большого объема. Я не хочу использовать определенные параметры контейнера.

требование

Возможность сжимать полезную нагрузку ответа (XML)БыстрееПроверенный в производстве для больших объемов примененияДолжны правильно установить соответствующиеContent-Encodingпортативный через контейнерыОпционально может распаковать запрос

Спасибо.

 Aravind R. Yarram24 янв. 2011 г., 15:29
@BalusC Спасибо за разъяснение этого. Ты прав. Я удалю это из поста.
 BalusC24 янв. 2011 г., 13:09
И длина контента? Это будет захват памяти. Просто позвольте отправлять его кусками, как это делают все.
 mm75931 мая 2017 г., 22:56
Я не пробовал, но это выглядит очень многообещающе для сжатия CSS и JS:wro4j.readthedocs.io/en/stable.

Ответы на вопрос(5)

который я использую для сжатия ресурсов в моих веб-приложениях:

public class CompressionFilter implements Filter {

    public void destroy() {
    }

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest httpRequest = (HttpServletRequest) request;
        Http,ServletResponse 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:

<filter>
    <filter-name>CompressionFilter</filter-name>
    <filter-class>com.my.company.CompressionFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>CompressionFilter</filter-name>
    <url-pattern>*.js</url-pattern>
</filter-mapping>
<filter-mapping>
    <filter-name>CompressionFilter</filter-name>
    <url-pattern>*.css</url-pattern>
</filter-mapping>
<filter-mapping>
    <filter-name>CompressionFilter</filter-name>
    <url-pattern>*.html</url-pattern>
</filter-mapping>
<filter-mapping>
    <filter-name>CompressionFilter</filter-name>
    <url-pattern>*.jsp</url-pattern>
</filter-mapping>
 German Attanasio15 окт. 2013 г., 05:18
Изображения, исполняемые файлы или файлы любого другого типа, которые не будут использовать преимущества сжатия.
 lapo24 янв. 2017 г., 12:13
Пожалуйста, не то, что это может сломатьсяIf-Match поддержка, еслиETag не удается (обычно с-gzip суффикс).
 electrotype24 дек. 2012 г., 17:34
Форматирование этого кода не идеально, но на самом деле он работает для меня, без каких-либо зависимостей. Огромное спасибо!
 SergeyB14 окт. 2013 г., 21:15
Спасибо за предоставление полных реализаций для всех классов, я предпочитаю это небольшое решение для импорта совершенно новой зависимости (которая поставляется с кучей собственных зависимостей). Вопрос, почему конкретно сопоставить с js / css / html / jsp, какие типы потоков вы не хотите сжимать?

http://nginx.org/en/docs/http/ngx_http_gzip_module.html, Но определенно, как сказал Зеки, лучше перенести это на выделенный веб-сервер.

Решение Вопроса

что я видел, большинство людей обычно используют фильтр сжатия gzip. Обычно изEHCache.

Реализация фильтра GZIP:net.sf.ehcache.constructs.web.filter.GzipFilter

Координата Maven для включения его в ваш проект:

<dependency>
    <groupId>net.sf.ehcache</groupId>
    <artifactId>ehcache-web</artifactId>
    <version>2.0.4</version>
</dependency>

Вам также нужно будет указать цель ведения журнала SLF4J. Если вы не знаете, что это такое или вам все равно, slf4j-jdk14 или slf4j-simple works:

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-jdk14</artifactId>
    <version>1.6.4</version>
</dependency>
 mckamey18 нояб. 2011 г., 18:57
Это отлично сработало для меня. Я только добавил ссылки на упомянутую реализацию для тех, кто пробует это, кто не слышал об ehcache.
 Steven22 янв. 2011 г., 00:14
может быть просто из уст в уста. или что многие проекты уже используют ehcache. в любом случае, это всегда казалось надежным и быстрым.
 schnatterer20 июл. 2016 г., 11:52
Если вы используете толькоGzipFilter изehcache-web и хотите избежать вздутия вашего приложения, вы можете исключитьehcache-webтранзитивная зависимостьehcache-core в вашейpom.xml вот так<exclusions><exclusion><artifactId>net.sf.ehcache></artifactId><groupId>ehcache-core</groupId></exclusion>
 Aravind R. Yarram21 янв. 2011 г., 15:15
какая-то конкретная причина, почему это предпочтительнее?
 Xdg06 авг. 2013 г., 08:02
Как можно применить GzipFilter только к некоторым указанным типам пантомимы? (ТАК:stackoverflow.com/questions/18061482/...)

gzipping. Apache с mod_deflate будет работать хорошо. У вас есть возможность поместить apache в тот же ящик или перенести его в другой ящик, чтобы сжатие не влияло на ваше приложение. mod_jk или mod_proxy будут нормально работать в этой настройке.

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

 Steven21 янв. 2011 г., 08:07
@ jmort253 - есть несколько других причин, по которым вы можете использовать apache перед причалом. например может быть для балансировки нагрузки нескольких причалов.
 jmort25321 янв. 2011 г., 07:04
Откуда ты знаешь, что он использует Tomcat? Я использую Jetty, который является полноценным веб-сервером, и они не рекомендуют ставить Apache перед ним.
 Aravind R. Yarram21 янв. 2011 г., 05:33
Я хочу, чтобы это решение было переносимым, поэтому это не то решение, которое я ищу.

Ваш ответ на вопрос