Это лучше сделать с помощью сервлета Filter
, а не пружины HandlerInterceptor
, поскольку Filter
может заменить запрос и / или объекты ответа, и вы можете использовать этот механизм для замены ответа оболочкой, которая регистрирует выходные данные ответа.
Это потребует написания подкласса HttpServletResponseWrapper
с переопределением getOutputStream
(и, возможно, также getWriter()
). Эти методы будут возвращать OutputStream
/ PrintWriter
реализаций, которые перекачивают поток ответов в журнал, в дополнение к отправке в исходное место назначения. Простой способ сделать это - использовать TeeOutputStream
из Apache Commons IO , но это не сложно реализовать самостоятельно.
Вот пример того, что вы можете сделать, используя GenericFilterBean
и DelegatingServletResponseStream
Spring, а также TeeOutputStream
, чтобы упростить задачу:
public class ResponseLoggingFilter extends GenericFilterBean {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException {
HttpServletResponse responseWrapper = loggingResponseWrapper((HttpServletResponse) response);
filterChain.doFilter(request, responseWrapper);
}
private HttpServletResponse loggingResponseWrapper(HttpServletResponse response) {
return new HttpServletResponseWrapper(response) {
@Override
public ServletOutputStream getOutputStream() throws IOException {
return new DelegatingServletOutputStream(
new TeeOutputStream(super.getOutputStream(), loggingOutputStream())
);
}
};
}
private OutputStream loggingOutputStream() {
return System.out;
}
}
Это записывает все в STDOUT. Если вы захотите войти в файл, он станет намного более сложным, что обеспечит закрытие потоков и т. Д., Но принцип останется прежним.