Java Struts和日志HTTP POST请求体

Java Struts和日志HTTP POST请求体,java,tomcat,logging,servlets,http-post,Java,Tomcat,Logging,Servlets,Http Post,我试图在基于Struts的应用程序中记录HTTP POST请求的原始主体,该应用程序在Tomcat6上运行。我已经找到了一个,所以这有点帮助,但接受的解决方案在我的情况下不能正常工作。问题是,我只想在某些情况下记录POST主体,让Struts在记录之后解析主体中的参数。目前,在我编写的过滤器中,我可以从HttpServletRequestWrapper对象读取并记录主体,但是在这之后Struts找不到任何要解析的参数,因此DispatchAction调用(取决于请求中的一个参数)失败 我在Str

我试图在基于Struts的应用程序中记录HTTP POST请求的原始主体,该应用程序在Tomcat6上运行。我已经找到了一个,所以这有点帮助,但接受的解决方案在我的情况下不能正常工作。问题是,我只想在某些情况下记录POST主体,让Struts在记录之后解析主体中的参数。目前,在我编写的过滤器中,我可以从HttpServletRequestWrapper对象读取并记录主体,但是在这之后Struts找不到任何要解析的参数,因此DispatchAction调用(取决于请求中的一个参数)失败

我在Struts和Tomcat源代码中做了一些挖掘,发现将POST主体存储到字节数组中,并基于该数组公开流和读卡器并不重要;当需要解析参数时,Tomcat的请求对象会访问其内部InputStream,此时已经读取了InputStream


有人知道如何正确地实现这种日志记录吗?

您在过滤器中要做的是读取完整的帖子内容,然后将请求传递给链;用您自己的返回输入流。例如,您读取磁盘上的post to文件,然后在调用时:

chain.doFilter(new ServletRequest() {}, response);
您可以将类的大多数方法调用委托给原始请求,但在打开输入流时,您需要从磁盘上的文件中读取


您需要确保不泄漏资源,因为这将被频繁调用,如果操作不正确,可能会造成伤害。

问题链接过滤器示例中的问题看起来不错,应该可以正常工作。也许您是在Struts dispatcher过滤器之后的
web.xml
中定义它。这样一来,解析和记录请求主体并使其可用于Struts就太晚了。您需要在Struts dispatcher筛选器之前声明此筛选器。过滤器顺序很重要,它们是按照
web.xml

中定义的顺序调用的。事实上,Struts不解析参数,它依赖Servlet容器来完成。一旦容器读取了inputStream以创建参数映射,当然就没有什么可读取的了。在Tomcat实现中,如果您首先读取inputStream,那么getParameter*方法家族就没有什么可处理的了,因为正如您正确地注意到的,它不使用getInputStream或getReader,而是在内部访问其优化的读取器。
因此,ServletRequestWrapper中唯一的解决方案是重写getInputStream、getReader和getParameter*家族,Struts依赖于这些家族来读取参数。也许您可以查看org.apache.catalina.util.RequestUtil,以避免复制正文后解析部分。

过滤器被定义为链中的第一个过滤器。一旦过滤器运行,流就被清空,参数甚至对请求的servlet都不可用,更不用说Struts了。问题出在重写的方法中。Tomcat的RequestFacade允许我重写getInputStream()方法,但这还不够好,因为请求(在其parseParameters()方法中)使用了受保护的getStream()方法。我希望我不必这样做,但看起来这是唯一的选项。