【发布时间】:2013-08-31 14:45:43
【问题描述】:
我的应用程序需要检查 POST 请求的内容/数据/正文/有效负载,而不更改后续 getParameter 调用的结果。
从 inputStream 中读取正文:
可以使用来自request.getInputStream 的 InputStream 或来自request.getReader 的 BufferedReader 读取正文。
读取 POST 参数:
POST 请求通常在请求正文中包含请求参数。这些可以使用getParameter 检索。
问题:
第一个 getParameter 调用在内部解析 inputStream 并将所有参数插入到参数 HashMap 中。它要求 inputStream 仍然包含要解析的内容。因此,人们无法检查内容,但仍然可以进行有效的 getParameter 调用。
建议的(但不充分的)解决方案
创建一个请求包装器,用于缓存输入流并为 getInputStream 返回缓存。
我在网上看到过这个解决方案,但它不起作用,因为getParameter实际上并没有调用getInputStream,而是指埋在请求对象中的原始inputBuffer。我已经尝试过了,无论是在 Servlet 中还是通过使用过滤器
我能想到的唯一解决方案是重写 getParameter 以手动实际解析缓存的输入流。但这感觉是个坏主意。
有没有人有任何可行的替代方案? (这是Tomcat 5.5)这感觉应该是一个常见的用例;我不敢相信这有多么困难。
【问题讨论】:
-
该问题的答案不是解决方案。我已经实现了它,但未能解决问题。从那时起,我阅读了 tomcat 源代码并意识到 getParameter 不会调用 getInputStream,正如我上面所说的,因此不会从流的缓存版本中读取。见grepcode.com/file/repo1.maven.org/maven2/tomcat/catalina/5.5.23/…我不知道为什么人们似乎发现它是一个解决方案。
-
方法
getParameter调用getInputStream。首先,getParameter调用parseParameters,然后parseParameters调用readPostBody,然后readPostBody调用getInputStream。
标签: java tomcat servlets post tomcat5.5