我正在尝试根据Struts,在Tomcat 6上运行的http Post请求的原始主体。我找到了一个 以前的帖子 因此,这有点有帮助,但是在我的情况下,公认的解决方案无法正常工作。问题是,我只想在某些情况下记录帖子主体, 记录后,让Struts解析体内的参数。当前,在我写的过滤器中,我可以从HttpservletRequestWrapper对象中阅读并记录正文,但是在此之后,Struts找不到任何参数可以解析,因此调度调用(这取决于请求中的一个参数)失败了。

我在支撑杆和tomcat源代码中进行了一些挖掘,发现我是否将柱的主体存储到字节数组中并根据该数组揭示流和读者都没关系。当需要分析参数时,Tomcat的请求对象将访问其内部InputStream,此时已经读取。

有人想知道如何正确实施这种记录吗?

有帮助吗?

解决方案

实际上,支柱并不能解析参数,而是依靠servlet容器来做到这一点。一旦容器读取了输入流以创建参数映射,当然,没有什么可读取的。在Tomcat实现中,如果您先阅读InputStream,那么GetParameter*方法家族无需使用,因为您正确地注意到,它不使用GetInputStream或GetReader,但可以内部访问其优化的读者。因此,您在ServletRequestWrapper中唯一的解决方案是覆盖getInputStream,getReader和getParameter* family rents依赖于读取参数的家族。也许您可以查看org.apache.catalina.util.requestutil,以不复制身体解析部分。

其他提示

您必须在过滤器中要做的是完整阅读帖子内容,然后将请求传递给链条;用自己的输入流返回输入流。例如,您阅读要在磁盘上提交的帖子,然后打电话:

chain.doFilter(new ServletRequest() {}, response);

您可以将类的大多数方法委托给原始请求,但是当需要打开输入流时,您需要从磁盘上的文件中读取。

您需要确保您不会泄漏资源,因为这将经常被调用,如果不正确地进行,可能会受到伤害。

在问题中,链接的过滤器示例看起来不错,应该工作。也许您正在定义它 web.xml 支柱调度器过滤器。那确实是为时已晚,无法解析和记录请求主体,并且仍然可以用于支撑杆。您需要声明此过滤器 支柱调度器过滤器。过滤器的顺序事项,它们被定义为按顺序调用 web.xml.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top