2

对于请求 'POST /' [Error parsing application/x-www-form-urlencoded]

我只在 IE 上收到此错误。所有其他浏览器都可以处理它而不会哭泣。试图谷歌这个错误,但找不到任何有用的东西。知道应该做些什么来避免它吗?也许我在一般使用我不知道的框架时做错了什么?

4

4 回答 4

3

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.

于 2013-06-06T13:57:39.667 回答
2

以防万一这对其他人有帮助,我刚刚遇到了这个问题,在调试后我发现一个 javascript 验证库正在引入一个隐藏的输入,IE 随后对其进行了编码。

该库来自这里:http: //jqueryvalidation.org/

我碰巧使用的是 play 2.2.2,所以当 2.3.0 发布时,这应该不是问题。

我的解决方法是编辑验证脚本并注释掉隐藏输入的添加。在我的用例中,无论如何都不需要那段代码。

于 2014-05-07T22:08:08.890 回答
1

好的,我已经调试了 Play!来源,我找到了导致此错误的代码。就是ContentTypes.scaladef 容错FormUrlEncoded的方法 抛出了 NoSuchElementException,这是由非关闭引起的<input type="hidden"

所以我建议你检查你的表格。

于 2013-02-14T11:15:23.020 回答
0

我能够在受控环境(使用普通表单和 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 是干净的,则此错误不会影响您。

于 2014-10-06T22:27:25.620 回答