记录HttpRequest参数和请求正文

Noa*_*evo 10 java spring-mvc httprequest

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

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

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

问题是 - 稍后我会IllegalStateException在弹簧控制器尝试读取请求时得到一个.

有办法做我想做的事吗?

Ada*_*ent 6

您可以使用过滤器执行此操作.请求参数易于处理.但是,处理请求体将会更加困难,并且需要包装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
    }

}
Run Code Online (Sandbox Code Playgroud)