Search code examples
javaspring-mvchttprequest

Logging HttpRequest parameters and request body


I am trying to create a request log for my web app. I am using Spring 3. 0.

I implemented a class extending HandlerInterceptorAdapter and used the preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) to intercept the request.

In the method i want to be able to log the request body (my parameters are objects in XML that are written directly to the request body), and for that i use request.getReader();

The problem is - later on I will get an IllegalStateException when the spring controller tries to read the request.

Is there a way to do what I intend?


Solution

  • You can do this with a filter. The request parameters are easy to handle. However dealing with the request body will be much more difficult and will require wrapping the servlet request see: HttpServletRequest.

    You will need to look how big the incoming request is and decide whether you want to store the request body as a tmp file or string.

    You will need to override ServetRequest.getInputStream() with your file or saved string that used for logging.

    If the request body is huge I recommend putting the input stream into a buffered input stream and then reading the start of the body.

    public class LogRequest extends HttpServletRequestWrapper {
    
        public LogRequest(HttpServletRequest request) {
            super(request);
        }
    
        @Override
        public ServletInputStream getInputStream() throws IOException {
            //read from tmp file or string.
        }
    
        @Override
        public BufferedReader getReader() throws IOException {
            //read from tmp file or string
        }
    
    }