Мое требование: Сократите 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);
}
}
Это хорошо работает:
Как вы, вероятно, видите из кода фильтра, существует проблема, я вызываю doFilter, а затем пишу в ответ.Это нехорошо, и фактически оставляет меня со спамом внутри журнала:
Я хочу избавиться от этого спама, как можноЯ делаю это? Я пытался поместить мой фильтр с самым низким приоритетом @Order ..., то есть целое число max -1, у bud все еще был пустой запрос, я думаю, что это неправильный способ сделать это. Есть ли способ безопасно выполнить мою логику где-нибудь в конце цепочки фильтров, или я должен поместить ее где-то еще, а не в сервлет-фильтр?
Этот подход был взят из: https://www.byteslounge.com/tutorials/how-to-compress-response-html-in-java-web-application
Однако они, похоже, игнорируют этот порядок вещей в этой реализации.