Вход органа по ответу (HTML) от HttpServletResponse с помощью Spring MVC HandlerInterceptorAdapter

Я пытаюсь зарегистрироваться (только к консольной записи теперь для пользы простоты), финал представил 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 и т.п..

Заранее спасибо.

26
задан skaffman 28 January 2010 в 23:16
поделиться

2 ответа

Это было бы лучше сделать с использованием фильтра сервлета , а не пружина 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. Если вы хотите войти в файл, он получит большую сложную, что с уверенностью, чтобы потоки были закрыты и так далее, но принцип остается прежним.

21
ответ дан 28 November 2019 в 07:33
поделиться

Если вы используете (или рассматриваете) logback в качестве фреймворка для ведения логов, то уже есть хороший сервлет-фильтр, который делает именно это. Посмотрите главу о TeeFilter в документации .

9
ответ дан 28 November 2019 в 07:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: