记录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
}
}