Я работаю над новой функцией нашего бэкэнда, которая включает сохранение некоторых данных из запросов, отправленных на сервер. Я могу легко получить все данные из запроса, используя следующий фильтр:
@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
показался здесь правильным выбором, поскольку у нас есть все, что нам нужно до или после цепочки фильтров.
- Что такое лучший подход в этом случае?
- Почему я не могу прочитать ответ на фильтре?