Stream<String> lines = request.getReader().lines();
lines.forEach((s)-> {
System.out.println("s = " + s);
}
);
Spring 에서 Interceptor 의 preHandle 메서드는 DispatcherServlet 이전에 실행된다. 그러면 먼저 logger 를 찍을 때 HTTP message 의 BODY 를 interceptor 에서 읽게된다. 그러면 이후에 controller 에 들어갔을 때, HTTP Message body 를 읽을 수 없다. Stream 의 특성 상 단 한번만 소비될 수 있기 때문이다.

@Component
public class HttpRequestWrapperFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
ContentCachingRequestWrapper httpRequest = new ContentCachingRequestWrapper((HttpServletRequest) servletRequest);
filterChain.doFilter(httpRequest , servletResponse);
}
}

해당 클래스는
public class LoggerInterceptor implements HandlerInterceptor {
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler , Exception ex) throws Exception {
ContentCachingRequestWrapper requestInfo = (ContentCachingRequestWrapper) request;
String requestBody = requestInfo.getContentAsString();
if(200 <= response.getStatus() && response.getStatus() < 300){
log.info("url = {} , method = {} , body = {}" , request.getRequestURL() , request.getMethod() , requestBody);
}else{
log.error("url = {} , method = {} , status = {} , body = {}" , request.getRequestURL() , request.getMethod() , response.getStatus() , requestBody);
}
}
}
