ClientHttpRequestInterceptor и OncePerRequestFilter заказ - PullRequest
0 голосов
/ 07 февраля 2020

У меня есть веб-приложение, которое получает запросы, затем вызывает несколько API и возвращает ответ на основе этих API. Ничего экстраординарного.

Я пытаюсь достичь:

  1. Регистрация запросов и ответов моего приложения
  2. Регистрация каждого запроса и ответа моего приложения на каждый API

Мой подход заключался в создании фильтра для регистрации запросов и ответов моего приложения и перехватчика для регистрации вызовов API

Код фильтра и перехватчика mi выглядит следующим образом:

@Component
public class LoggingRequestFilter extends OncePerRequestFilter {

  @Override
  protected void doFilterInternal(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse,
      FilterChain filterChain) throws ServletException, IOException {

    CustomContentCachingRequestWrapper requestWrapper =  new CustomContentCachingRequestWrapper(httpServletRequest);
    ContentCachingResponseWrapper responseWrapper = new ContentCachingResponseWrapper(httpServletResponse);

    logRequestInfo(requestWrapper);

    filterChain.doFilter(requestWrapper, responseWrapper);

    logResponseInfo(requestWrapper, responseWrapper);

    responseWrapper.copyBodyToResponse();
  }

...

}
public class LoggingRequestInterceptor implements ClientHttpRequestInterceptor {

    @Override
    public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException {
        traceRequest(request, body);
        ClientHttpResponse response = execution.execute(request, body);
        traceResponse(response);
        return response;
    }

...

}

Но порядок записи нарушен, выглядит так:

  • Запрос к приложению
  • Запрос к API-1
  • Ответ API-1
  • Запрос к API-2
  • Ответ приложения
  • Ответ API-2

Почему журнал ответов API-2 после ответа приложения?

Является ли ClientHttpRequestInterceptor совершенно другим по сравнению с HandlerInterceptorAdapter и не ведет себя так, как на рисунке ниже?

http://mkjava.com/tutorial/images/interceptor.png

PD : То же самое происходит с окончательным журналом из CommonsRequestLoggingFilter

...