我试图在运行于Tomcat 6的基于Struts的应用程序中记录HTTP POST请求的原始正文。我在SO上找到一个previous post有点帮助,但在以下情况下无法接受的解决方案无法正常工作我的情况。问题是,我只想在某些情况下记录POST主体,并让Struts在记录后从主体解析参数。当前,在我写的Filter中,我可以从HttpServletRequestWrapper对象读取和记录主体,但是此后Struts找不到要解析的任何参数,因此DispatchAction调用(取决于请求中的参数之一)失败。

我对Struts和Tomcat源代码进行了一些挖掘,发现是否将POST正文存储在字节数组中并公开基于该数组的Stream和Reader都没有关系。当需要解析参数时,Tomcat的Request对象将访问其内部InputStream,该输入当时已经被读取。

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

最佳答案

实际上,Struts不会解析参数,而是依靠Servlet容器来执行此操作。并且,一旦容器读取了inputStream来创建参数Map,则当然没有什么要读取了。并且在Tomcat实现中,如果您首先读取inputStream,则getParameter *系列方法将一无所有,因为,正如您正确地指出的那样,它不使用getInputStream或getReader,而是在内部访问其优化的阅读器。
因此,在ServletRequestWrapper中唯一的解决方案是重写Struts依赖于其读取参数的getInputStream,getReader和getParameter *系列。也许您可以看看org.apache.catalina.util.RequestUtil来不重复POST正文解析部分。

关于java - Struts和日志记录HTTP POST请求正文,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2448737/

10-14 20:20