Java Spring - фильтр сервлетов, который выполняет минификацию [для этого ответа уже был вызван метод getOutputStream ()] - PullRequest
0 голосов
/ 22 апреля 2019

Мое требование: Сократите html до максимума для каждого ответа.

Это было достигнуто путем создания фильтра сервлета с компрессором, который сжимает данные внутри ответа:

import com.googlecode.htmlcompressor.compressor.HtmlCompressor;
import org.springframework.stereotype.Component;

import javax.servlet.*;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@Component
public class CompressResponseFilter implements Filter {

    private HtmlCompressor compressor;

    @Override
    public void doFilter(ServletRequest req, ServletResponse resp,
                         FilterChain chain) throws IOException, ServletException {

        CharResponseWrapper responseWrapper = new CharResponseWrapper(
                (HttpServletResponse) resp);

        chain.doFilter(req, responseWrapper);

        String servletResponse = responseWrapper.toString();
        resp.getWriter().write(compressor.compress(servletResponse));
    }

    @Override
    public void init(FilterConfig config) throws ServletException {
        compressor = new HtmlCompressor();
        compressor.setCompressCss(true);
        compressor.setCompressJavaScript(true);
        compressor.setRemoveComments(true);
        compressor.setSimpleDoctype(true);
        compressor.setRemoveQuotes(true);
        compressor.setRemoveIntertagSpaces(true);
    }

}

Это хорошо работает: enter image description here

Как вы, вероятно, видите из кода фильтра, существует проблема, я вызываю doFilter, а затем пишу в ответ.Это нехорошо, и фактически оставляет меня со спамом внутри журнала:

enter image description here

Я хочу избавиться от этого спама, как можноЯ делаю это? Я пытался поместить мой фильтр с самым низким приоритетом @Order ..., то есть целое число max -1, у bud все еще был пустой запрос, я думаю, что это неправильный способ сделать это. Есть ли способ безопасно выполнить мою логику где-нибудь в конце цепочки фильтров, или я должен поместить ее где-то еще, а не в сервлет-фильтр?

Этот подход был взят из: https://www.byteslounge.com/tutorials/how-to-compress-response-html-in-java-web-application

Однако они, похоже, игнорируют этот порядок вещей в этой реализации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...