У меня есть фильтр, который дважды регистрирует тело запроса. Сначала я печатаю тело запроса из объекта запроса, а затем передаю объект запроса и ответа в FilterChain. Затем в finally {} я снова печатаю содержимое тела в объекте запроса. Но содержание больше не то же самое. На самом деле контент на шаге 1 пуст, а на шаге 2 выглядит лучше. Что происходит?
public class RequestAndResponseLoggingFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
if (isAsyncDispatch(request)) {
filterChain.doFilter(request, response);
} else {
doFilterWrapped(wrapRequest(request), wrapResponse(response), filterChain);
}
}
protected void doFilterWrapped(ContentCachingRequestWrapper request, ContentCachingResponseWrapper response, FilterChain filterChain) throws IOException, ServletException {
try {
// Step-1: Print the request body (at request time)
String requestBody = extractRequestBody(request);
log.info("Request Body: " + requestBody);
// Pass the request and response object to FilterChain
filterChain.doFilter(request, response);
}
finally {
// Step-2: Print again the request body (at response time). Do not get the same output as in Step-1.
String requestBody = extractRequestBody(request);
log.info("Request Body: " + requestBody);
}
}
private static String extractRequestBody(ContentCachingRequestWrapper request) {
byte[] content = request.getContentAsByteArray();
if (content.length > 0) {
return new String(content, request.getContentType());
}
return "";
}
}
Я знаю, что может быть другой Фильтр или Перехватчик, который может изменить его, но у меня его нет. По крайней мере, не написано от меня. Что представляет собой механизм, который изменяет тело запроса в объекте запроса во время обработки запроса? Я использую Spring Boot с Spring MVC. Мой фильтр расширяет OncePerRequestFilter из springframework.