我处于这样一种情况:我的应用程序需要检查POST请求的内容/数据/主体/负载,而不改变后续 getParameter 调用的结果。
从 inputStream 中读取主体:
可以使用
读取 POST 参数:
POST 请求通常在请求的主体中包含请求参数。这些可以使用
问题:
第一个 getParameter 调用内部解析 inputStream 并将所有参数插入参数 HashMap。它需要仍然包含解析内容的 inputStream。因此,无法检查内容并仍然具有工作的 getParameter 调用。
建议(但不足够)的解决方案:
创建一个请求包装器,缓存 inputstream 并返回缓存以获取 InputStream。
我已经看到这种解决方案在整个 web 上都被提出过,但它不起作用,因为 getParameter 实际上没有调用 getInputStream,而是引用了 buried 在 request 对象中的原始 inputBuffer。我已经尝试过了,既从 Servlet 内部,也通过使用过滤器。
我能想到的唯一解决方案涉及重新编写 getParameter 以手动解析缓存的 inputstream。但是这感觉像一个坏主意。
是否有人有任何其他有效的替代方案?(这是 Tomcat 5.5)这似乎应该是一个常见的用例;我无法相信它有多么困难。
从 inputStream 中读取主体:
可以使用
request.getInputStream
或 request.getReader
中的 InputStream 读取主体。读取 POST 参数:
POST 请求通常在请求的主体中包含请求参数。这些可以使用
getParameter
检索。问题:
第一个 getParameter 调用内部解析 inputStream 并将所有参数插入参数 HashMap。它需要仍然包含解析内容的 inputStream。因此,无法检查内容并仍然具有工作的 getParameter 调用。
建议(但不足够)的解决方案:
创建一个请求包装器,缓存 inputstream 并返回缓存以获取 InputStream。
我已经看到这种解决方案在整个 web 上都被提出过,但它不起作用,因为 getParameter 实际上没有调用 getInputStream,而是引用了 buried 在 request 对象中的原始 inputBuffer。我已经尝试过了,既从 Servlet 内部,也通过使用过滤器。
我能想到的唯一解决方案涉及重新编写 getParameter 以手动解析缓存的 inputstream。但是这感觉像一个坏主意。
是否有人有任何其他有效的替代方案?(这是 Tomcat 5.5)这似乎应该是一个常见的用例;我无法相信它有多么困难。
getParameter
调用getInputStream
。首先,getParameter
调用parseParameters
,然后parseParameters
调用readPostBody
,最后readPostBody
调用getInputStream
。 - peakmuma