记录HttpRequest参数和请求正文


问题内容

我正在尝试为我的Web应用程序创建请求日志。我正在使用Spring3。0。

我实现了一个扩展类,HandlerInterceptorAdapter并使用preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)拦截了请求。

在该方法中,我希望能够记录请求正文(我的参数是直接写入请求正文的XML对象),为此我使用 request.getReader();

问题是-稍后,IllegalStateException当spring控制器尝试读取请求时,我将得到一个。

有什么办法可以实现我的预期?


问题答案:

您可以使用过滤器执行此操作。请求参数易于处理。但是,处理请求主体会更加困难,并且需要包装servlet请求,请参见:HttpServletRequest

您将需要查看传入的请求有多大,并确定是将请求正文存储为tmp文件还是字符串。

您将需要使用用于日志记录的文件或保存的字符串覆盖ServetRequest.getInputStream()。

如果请求主体很大,我建议将输入流放入缓冲的输入流中,然后读取主体的开头。

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
    }

}