ContentCachingResponseWrapper Produces Empty Response

前端 未结 3 876
傲寒
傲寒 2020-11-29 03:54

I\'m trying to implement filter for logging requests and responses in Spring MVC application. I use the following code:

@Component
public class          


        
3条回答
  •  死守一世寂寞
    2020-11-29 04:43

    Finally solved the problem. Here is the perfect solution:

    import com.fasterxml.jackson.databind.JsonNode;
    import com.fasterxml.jackson.databind.ObjectMapper;
    import org.apache.commons.io.IOUtils;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.http.*;
    import org.springframework.stereotype.Component;
    import org.springframework.web.filter.OncePerRequestFilter;
    import org.springframework.web.util.ContentCachingRequestWrapper;
    import org.springframework.web.util.ContentCachingResponseWrapper;
    
    import javax.servlet.FilterChain;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.net.URI;
    import java.util.Enumeration;
    import java.util.Map;
    
    import static java.nio.charset.StandardCharsets.UTF_8;
    import static net.logstash.logback.marker.Markers.appendFields;
    
    @Component
    public class LoggingFilter extends OncePerRequestFilter {
    
      private static final Logger LOGGER = LoggerFactory.getLogger(LoggingFilter.class);
    
      @Autowired
      private ObjectMapper objectMapper;
    
      @Override
      protected void doFilterInternal(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, FilterChain filterChain) throws ServletException, IOException {
    
        ContentCachingRequestWrapper requestWrapper = new ContentCachingRequestWrapper(httpServletRequest);
        ContentCachingResponseWrapper responseWrapper = new ContentCachingResponseWrapper(httpServletResponse);
    
        filterChain.doFilter(requestWrapper, responseWrapper);
    
        String requestUrl = requestWrapper.getRequestURL().toString();
        HttpHeaders requestHeaders = new HttpHeaders();
        Enumeration headerNames = requestWrapper.getHeaderNames();
        while (headerNames.hasMoreElements()) {
          String headerName = (String) headerNames.nextElement();
          requestHeaders.add(headerName, requestWrapper.getHeader(headerName));
        }
        HttpMethod httpMethod = HttpMethod.valueOf(requestWrapper.getMethod());
        Map requestParams = requestWrapper.getParameterMap();
    
        String requestBody = IOUtils.toString(requestWrapper.getInputStream(),UTF_8);
        JsonNode requestJson = objectMapper.readTree(requestBody);
    
        RequestEntity requestEntity = new RequestEntity<>(requestJson,requestHeaders, httpMethod, URI.create(requestUrl));
        LOGGER.info(appendFields(requestEntity),"Logging Http Request");
    
    
        HttpStatus responseStatus = HttpStatus.valueOf(responseWrapper.getStatusCode());
        HttpHeaders responseHeaders = new HttpHeaders();
        for (String headerName : responseWrapper.getHeaderNames()) {
          responseHeaders.add(headerName, responseWrapper.getHeader(headerName));
        }
        String responseBody = IOUtils.toString(responseWrapper.getContentInputStream(), UTF_8);
        JsonNode responseJson = objectMapper.readTree(responseBody);
        ResponseEntity responseEntity = new ResponseEntity<>(responseJson,responseHeaders,responseStatus);
        LOGGER.info(appendFields(responseEntity),"Logging Http Response");
        responseWrapper.copyBodyToResponse();
      }
    }
    

提交回复
热议问题