HTML表单似乎正在提交* POST和GET?

时间:2016-10-04 09:11:25

标签: javascript forms

这不是this等问题的重复,而是相反的:我有一个我通过jQuery提交的表单

    $('<form>', {
        action  : 'service',
        method  : 'post',
        target  : '_blank'
    }).append(
        $('<input>', {
            type    : 'hidden',
            name    : 'payload',
            value   : JSON.stringify(payload)
        })
    ).appendTo('body').submit().remove();

这样做是为了让我可以用HTML打开另一个页面。

由于我需要提交相当多的复杂信息,我实际上将它们全部序列化为一个大的JSON字符串,然后创建一个只有一个字段的表单(&#34;有效负载&#34;)并提交< EM>那

接收端有一个过滤器,如下所示:

  • 如果方法是POST,
  • 并且只有一个提交的变量,
  • 并且该一个变量的名称是&#34;有效负载&#34;,
  • 然后 JSON解码其值并使用它来创建虚假的GET数据。

因此,当GET数据增长太多时,我可以在不修改实际脚本的情况下切换方法,这通常没有任何变化。

它一直有效,直到今天。

应该发生什么

服务器应该收到一个POST提交,并在弹出窗口中打开相应的响应。

实际发生了什么

服务器确实收到了正确的POST提交...

......显然忽略了它......

...并且 之后,浏览器发出了一个带有 no parameters 的GET,这是无参数GET得到的结果(请原谅双关语)显示在弹出窗口中。

毫不奇怪,这总是一个&#34;你没有提交任何参数&#34;错误。咄。

我已经做了什么

  • 验证此方法有效,并且过去几年一直使用不同的表单和不同的服务端点
  • 尝试使用HTML中的硬编码<FORM>替换表单,不使用任何jQuery 。结果相同。所以,这不是一个jQuery问题。
  • 尝试使用不同的浏览器(如果它只适用于某些浏览器,它就没有用了:我需要支持大多数现代浏览器。不过,我检查过。幸运的是,这种失败在所有浏览器中都会重现,甚至在iPhone上也是如此。) / LI>
  • 尝试发送少量数据(只是&#34; {test:0}&#34;)。
  • 尝试在收到任何内容后立即暂停端点脚本。
  • 已选中Stack Overflow。我在seems to be the same problem various中找到了flavours,但它有点不舒服。 This one有一个有趣的问题,但没有,它没有帮助。
  • 检查了防火墙,代理,广告拦截器和插件(我现在使用的是普通的Firefox)。
  • 打电话给IT人员并询问有关最近SVN提交的尖锐问题。没有。

我还没做什么

  • 检查较低级别的HTTPS对话(我没有足够的访问权限)。
  • 逐步比较服务器的配置,以及新服务器的配置。
  • 很明显,戴上我的思维帽子。

1 个答案:

答案 0 :(得分:3)

使用hurl.itPostman等工具手动向服务器发送请求。这些工具可以很好地显示来自服务器的响应,包括所有HTTP头。我怀疑服务器使用重定向(状态代码30X)进行响应,这导致在GET完成后发出POST请求。

更新:HTTP重定向

HTTP重定向不一定使用相同的HTTP方法甚至相同的数据来向重定向目标发出请求。特别是对于非幂等请求,这可能是一个安全问题(您通常不希望您的表单提交自动重新提交到另一个地址)。但是,HTTP为您提供了两种选择:

  

[...]因此,HTTP / 1.1(RFC 2616)添加了新的状态代码303和307 [...],其中303强制要求将请求类型更改为GET,307保留最初发送的请求类型。尽管这种消歧提供了更大的清晰度,但302代码仍然在Web框架中使用,以保持与未实现HTTP / 1.1规范的浏览器的兼容性。

     

[来自Wikipedia: HTTP 302 ]

同样适用于301s:

  

如果收到301状态代码以响应GET或HEAD以外的任何类型的请求,客户端必须在重定向之前询问用户。

     

[来自Wikipedia: HTTP 301 ]