对于请求 'POST /' [Error parsing application/x-www-form-urlencoded]
我只在 IE 上收到此错误。所有其他浏览器都可以处理它而不会哭泣。试图谷歌这个错误,但找不到任何有用的东西。知道应该做些什么来避免它吗?也许我在一般使用我不知道的框架时做错了什么?
对于请求 'POST /' [Error parsing application/x-www-form-urlencoded]
我只在 IE 上收到此错误。所有其他浏览器都可以处理它而不会哭泣。试图谷歌这个错误,但找不到任何有用的东西。知道应该做些什么来避免它吗?也许我在一般使用我不知道的框架时做错了什么?
I was experiencing the same with IE10, and I traced it to the POST content being:
email=fred@example.com&password=asd&=
The final "&=" causes an exception in FormUrlEncodedParser, which is swallowed and converted to a BadRequest in BodyParsers.tolerantFormUrlEncoded.
In summary, to my understanding, this is the combination of two bugs:
MSIE10 is sending those two characters for whatever reason (there seem to be several possible such reasons).
Play does not tolerate those useless characters in the query string (where it is customary that unknown parameters in URLs should be ignored by server apps). I've reported this as a bug: https://github.com/playframework/Play20/issues/1185
In my case, the "whatever reason" was a tag with no "name" attribute. In GafrieldKlon's case, it was an unclosed <input type="hidden". Your's may be another.
以防万一这对其他人有帮助,我刚刚遇到了这个问题,在调试后我发现一个 javascript 验证库正在引入一个隐藏的输入,IE 随后对其进行了编码。
该库来自这里:http: //jqueryvalidation.org/
我碰巧使用的是 play 2.2.2,所以当 2.3.0 发布时,这应该不是问题。
我的解决方法是编辑验证脚本并注释掉隐藏输入的添加。在我的用例中,无论如何都不需要那段代码。
好的,我已经调试了 Play!来源,我找到了导致此错误的代码。就是ContentTypes.scala中def 容错FormUrlEncoded的方法
抛出了 NoSuchElementException,这是由非关闭引起的<input type="hidden"
所以我建议你检查你的表格。
我能够在受控环境(使用普通表单和 PHP 服务器)中重新创建此行为。它发生在 IE 中,但没有发生在 Chrome 中(没有测试 Firefox 或 Safari)。问题只是部分 Play 对表单数据的处理。
造成这种情况的原因是:IE 似乎将每个表单字段与一个名称属性(是否为空)捆绑在一起,并将其放入发布数据中。这意味着任何具有空名称属性 ( name=""
) 的表单元素都将被表示。这是基于“成功控制”的想法(http://www.w3.org/TR/html401/interact/forms.html#h-17.13.2)。规范尚不清楚(从我能找到的)是否具有“控件名称”意味着仅存在名称属性或具有非空值的名称属性。似乎 IE 从字面上理解并收集所有内容,而其他人则做了一个很好的额外步骤并过滤掉具有空名称的控件。
给定以下示例表单:
<form action="<?= $_SERVER['PHP_SELF']?>" method="POST">
<label>
Name
<input name="name"/>
</label>
<label>
Email
<input name="email"/>
</label>
<button type="submit" name="">Send 1</button>
</form>
IE9 导致附加&=Send
到 POST 数据。在 IE10/11 中,最后导致了上述&=
情况。作为记录,<button>
应该提交显式value
属性而不是标签内容。
然而,在我们的例子中(我是 kflorence 的同事,我在我们的代码库中查看了这个以给它一个全新的视角),我们的 HTML 在浏览器中是干净的。slohr 所说的(https://stackoverflow.com/a/23529360/2684520)是困扰我们的。
因此,请检查您的表单 HTML 是否有任何空name
属性。如果那是干净的,您可能会在提交表单或单击按钮时让一些 JS 注入有问题的字段或修改字段。如果您的表单 HTML 是干净的,则此错误不会影响您。