记录 HttpRequest 参数和请求正文

2022-09-04 21:44:09

我正在尝试为我的 Web 应用创建请求日志。我正在使用春季3。0.

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

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

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

有没有办法做我想要做的事?


答案 1

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

}

答案 2

Spring有一个现成的过滤器可以为您执行此操作 - 请参阅此答案中描述的用法及其子类。AbstractRequestLoggingFilter

请注意,使用此解决方案时,只有在请求处理完成并且应用程序已读取正文后,才会记录请求正文。


推荐