Регистрация тела ответа (HTML) из HttpServletResponse с использованием Spring MVC HandlerInterceptorAdapter - PullRequest
26 голосов
/ 29 января 2010

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

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

Ответы [ 4 ]

21 голосов
/ 31 января 2010

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

9 голосов
/ 01 февраля 2010

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

6 голосов
/ 30 октября 2012

Я некоторое время искал способ зарегистрировать полный HTTP-запрос / ответ и обнаружил, что он решен для меня в Tomcat 7 RequestDumperFilter .Он работает как рекламируется из контейнера Tomcat 7.Если вы хотите использовать его в Jetty, класс будет работать автономно или, как я это делал, скопировать и адаптировать к конкретным потребностям моей среды.

1 голос
/ 22 августа 2014

Я сделал небольшую библиотеку spring-mvc-logger доступной через maven central.

Добавить в pom.xml:

<dependency>
    <groupId>com.github.isrsal</groupId>
    <artifactId>spring-mvc-logger</artifactId>
    <version>0.2</version>
</dependency>

Добавить в web.xml:

<filter>
    <filter-name>loggingFilter</filter-name>
    <filter-class>com.github.isrsal.logging.LoggingFilter</filter-class>
</filter>

<filter-mapping>
    <filter-name>loggingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

Добавить в log4j.xml:

<logger name="com.github.isrsal.logging.LoggingFilter">
    <level value="DEBUG"/>
</logger>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...