Я пытаюсь зарегистрироваться (только к консольной записи теперь для пользы простоты), финал представил HTML, который будет возвращен HttpServletResponse. (т.е. тело) С этой целью, я использую HandlerInterceptorAdapter от Spring MVC как так:
public class VxmlResponseInterceptor extends HandlerInterceptorAdapter {
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println(response.toString());
}
}
Это работает как ожидалось, и я вижу заголовки ответа HTTP в консоли. Мой вопрос состоит в том, если существует относительно простой способ зарегистрировать весь орган по ответу (т.е. финал представил HTML) к консоли, не имея необходимость обращаться к выполнению паяцев с PrintWriters, OutputStream и т.п..
Заранее спасибо.
Это было бы лучше сделать с использованием фильтра сервлета
, а не пружина HandlerInterector
, для Причина, что фильтр
разрешен для замены объектов запроса и / или ответа, и вы можете использовать этот механизм, чтобы заменить ответ с помощью обертки, который регистрирует вывод ответа.
Это будет включать в себя написание подкласса httpservletresponsewrapper
, переопределение getOutputtream
(и, возможно, getwriter ()
). Эти методы вернутся вывод
/ Реализации PrintWriter
, которые сифон от потока ответа в журнал, в дополнение к отправке на исходный пункт назначения. Простой способ сделать это использует TeeoutPuredStream
из Apache Commons IO , но не сложно реализовать себя.
Вот пример того, что вы могли бы сделать, используя весна GenericFilterbean
и делегатингинсетреспрессет
, а также 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. Если вы хотите войти в файл, он получит большую сложную, что с уверенностью, чтобы потоки были закрыты и так далее, но принцип остается прежним.
Если вы используете (или рассматриваете) logback в качестве фреймворка для ведения логов, то уже есть хороший сервлет-фильтр, который делает именно это. Посмотрите главу о TeeFilter в документации .