Хотя ответ BalusC будет работать в большинстве сценариев, вы должны быть осторожны с вызовом flush
- он передает ответ, и никакая другая запись в него невозможна, например. через следующие фильтры.
Мы обнаружили некоторые проблемы с очень схожим подходом в среде Вебсферы, где полученный ответ был только частичным.
Согласно этому вопросу не следует вызывать флеш, и вы должны разрешить его вызывать изнутри.
Я решил проблему сброса, используя TeeWriter
(он разбивает поток на 2 потока) и используя небуферизованные потоки в «разветвленном потоке» для целей регистрации. Тогда нет необходимости вызывать flush
.
private HttpServletResponse wrapResponseForLogging(HttpServletResponse response, final Writer branchedWriter) {
return new HttpServletResponseWrapper(response) {
PrintWriter writer;
@Override
public synchronized PrintWriter getWriter() throws IOException {
if (writer == null) {
writer = new PrintWriter(new TeeWriter(super.getWriter(), branchedWriter));
}
return writer;
}
};
}
Тогда вы можете использовать это следующим образом:
protected void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException {
//...
StringBuilderWriter branchedWriter = new org.apache.commons.io.output.StringBuilderWriter();
try {
chain.doFilter(request, wrapResponseForLogging(response, branchedWriter));
} finally {
log.trace("Response: " + branchedWriter);
}
}
Код упрощен для пивоварения.