Http Servlet请求在读取一次POST body后丢失参数。

110

我想在Java Servlet过滤器中访问两个HTTP请求参数,这里没有什么新鲜事,但惊讶地发现这些参数已经被消耗了!因此,在过滤器链中不再可用。

似乎只有当参数以POST请求主体(例如表单提交)形式到达时才会出现这种情况。

有没有办法读取参数而不消耗它们?

到目前为止,我只找到了这个参考:Servlet Filter using request.getParameter loses Form data

谢谢!


2
也许可以展示一下你是如何实现的代码片段? - Pavel Veller
你使用了 getInputStream() 或者 getReader() 吗?看起来它们会干扰 getParameter() 的执行。 - evanwong
13个回答

0
如果您可以控制请求,您可以将内容类型设置为binary/octet-stream。这样可以查询参数而不消耗输入流。
但是,这可能只适用于某些应用服务器。我只测试了Tomcat,Jetty似乎也是根据https://dev59.com/l2oy5IYBdhLWcg3wfOB4#11434646的方式运行。

-1

你可以使用Servlet过滤器链,但是不要使用原始的,而是创建自己的请求yourOwnRequests扩展HttpServletRequestWrapper。


1
现在教程链接似乎包含病毒。 - fasth

-3
首先,我们不应该在过滤器中读取参数。通常,在过滤器中读取标头以执行一些身份验证任务。话虽如此,使用CharStreams可以在过滤器或拦截器中完全读取HttpRequest正文:
String body = com.google.common.io.CharStreams.toString(request.getReader());

这不会对后续的读取产生任何影响。


是的。如果您这样做一次,request.getReader() 就会返回一个读取器,随后的读取操作将只包含空字符串。 - christophetd
1
如果覆盖getReader()和getInputStream()方法以使用此新主体作为源,则我会工作。 - Rodrigo Borba

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接