我有一些奇怪的问题: 当我们通过 POST 提交 html 表单时,我们所有的参数都转到请求正文,如果它是 GET 提交:参数转到 URL 中的 queryString。
但是我们不能停止,例如我们可以发送 POST,在正文中包含参数,在 URL 中包含 queryString。这是问题所在,tomcat 解析请求并生成 org.apache.coyote.Request 对象 - 来自 queryString 和 body 的所有参数都转到 ParameterMap,我无法检测到参数来自何处。我可以获取 queryString 并从中解析参数,但我无法检测到这个参数是否在主体中。
例子:
1)
<form method="POST" action="someUrl/?a=1&a=2">
<input type="hidden" name="a" value="1"/>
<input type="hidden" name="a" value="2"/>
...
</form>
参数映射将有两个值 1,2,但没有任何信息它们来自何处。
2)
<form method="POST" action="someUrl/?a=1&a=2">
...
</form>
参数映射也将有两个值 1,2,没有任何信息它们是否在正文中。
是否应该重写tomcat的请求解析逻辑、wrap request等?如果应该 - 我想我需要一本手册。任何想法,猜测。谢谢。
最佳答案
Tomcat 期望参数可以来自查询字符串或请求正文,因此它会将其合并,这样您就不必在两者中都进行搜索。
但是如果你真的想允许参数的非标准使用,你可以使用 request.getQueryString()
获取查询字符串(并解析它以找到请求字符串参数)。
并且可以单独用request.getReader()
读取请求体,然后解析在body参数中查找。
ParameterMap 的使用有助于标准使用,但没有任何强制要求您实际使用它。
关于java - 重写tomcat HTTP请求解析逻辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37989439/