Пустой ServletResponse при чтении из фильтра - PullRequest
0 голосов
/ 09 июля 2020

Я работаю над новой функцией нашего бэкэнда, которая включает сохранение некоторых данных из запросов, отправленных на сервер. Я могу легко получить все данные из запроса, используя следующий фильтр:

@Component
public class MetricsFilter implements Filter {

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        ContentCachingRequestWrapper requestWrapper = new ContentCachingRequestWrapper((HttpServletRequest) servletRequest);
        ContentCachingResponseWrapper responseWrapper = new ContentCachingResponseWrapper((HttpServletResponse) servletResponse);
        filterChain.doFilter(requestWrapper, responseWrapper);
        responseWrapper.copyBodyToResponse();

        // the responseBody string is empty, even though I am accessing it after the filter chain.
        // Also, at this point the response already has a set status, for example, a 500 in case of an exception.
        String responseBody = new String(responseWrapper.getContentAsByteArray());
        // ...
    }
}

В частности, я хочу сохранить тело ответа в базе данных всякий раз, когда возникает внутренняя ошибка сервера (500) . Итак, я подумал, что могу прочитать здесь ответ так же, как я читаю запрос. Я изменил порядок фильтров с первого на последний, но это ничего не изменило.

Я прочитал много ответов на SO, например этот , но я продолжаю получать пустые тела ответов. Кроме того, я читал о ResponseBodyAdvice , но я хочу заполнить объект ответом, запросом и некоторыми метаданными. Эта метада включает время, затраченное сервером на обработку запроса, и поэтому Filter показался здесь правильным выбором, поскольку у нас есть все, что нам нужно до или после цепочки фильтров.

  1. Что такое лучший подход в этом случае?
  2. Почему я не могу прочитать ответ на фильтре?
...