package org.springframework.issues.filter; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectWriter; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.web.filter.OncePerRequestFilter; import javax.servlet.FilterChain; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; public class HttpDumperFilter extends OncePerRequestFilter { private static final Logger logger = LoggerFactory.getLogger(HttpDumperFilter.class); private static final Logger dumper = LoggerFactory.getLogger("http.dumper"); private final ObjectWriter objectWriter = new ObjectMapper().writer(); @Override protected void doFilterInternal(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, FilterChain filterChain) throws ServletException, IOException { try { long processingStarted = System.currentTimeMillis(); HttpRequestWrapper request = new HttpRequestWrapper(httpServletRequest); HttpResponseWrapper response = new HttpResponseWrapper(httpServletResponse); filterChain.doFilter(request, response); response.flushContent(); long processingTime = System.currentTimeMillis() - processingStarted; HttpDump httpDump = getDump(request, response, processingTime); dumper.info("{}", objectWriter.writeValueAsString(httpDump)); } catch (Exception ex) { logger.error("", ex); throw ex; } } private HttpDump getDump(HttpRequestWrapper request, HttpResponseWrapper response, long processingTime) throws IOException { HttpDump httpDump = new HttpDump(); httpDump.setProcessingTime(processingTime); httpDump.setRequestUri(request.getRequestURI()); httpDump.setRequestMethod(request.getMethod()); httpDump.setRequestHeaders(request.getRequestHeaders()); httpDump.setRequestBody(request.getRequestBody()); httpDump.setResponseStatus(response.getStatus()); httpDump.setResponseHeaders(response.getResponseHeaders()); httpDump.setResponseBody(response.getResponseBody()); return httpDump; } }