Содержимое тела HTTP-запроса изменяется после возврата из FilterChain - PullRequest
0 голосов
/ 18 марта 2020

У меня есть фильтр, который дважды регистрирует тело запроса. Сначала я печатаю тело запроса из объекта запроса, а затем передаю объект запроса и ответа в 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.

...