【问题标题】:How to deny HTML form submission if previous submission is still in action?如果之前的提交仍在进行,如何拒绝 HTML 表单提交?
【发布时间】:2011-06-04 12:51:41
【问题描述】:

所以我有这个使用 AJAX 执行相当长的数据发布的表单,现在我有点偏执,一些聪明的家伙可能会打开 firebug 并重新触发发布过程,而以前的仍然在运行。我该如何避免这种情况?

谢谢!

【问题讨论】:

  • 您可能还想考虑使服务器端操作更快的方法,例如将工作委托给另一个线程以异步完成,这样您就可以快速将某些内容返回给客户端。人们不喜欢无助地等待。

标签: javascript jquery html security form-submit


【解决方案1】:

你可以:

  • 禁用提交按钮。
  • 防止按 Enter 键。
  • 从表单标签中移除action 属性。
  • 在第一次提交时重定向到另一个页面,并使带有表单的页面过期。

话虽如此,您只能在前端做很多事情来防止重新提交 - 总有办法解决。如果您对此非常担心,那么服务器端验证也是必要的(而且通常还是推荐使用)。

【讨论】:

  • ...请注意,前三件事将涉及您在表单的“提交”处理函数中执行的操作。
  • 但我可以从 Firebug 启用提交按钮,同样适用于 Enter 按键、操作... + 我无法重定向到另一个页面...
  • 前端能做的只有这么多——总有办法的。如果您对此非常担心,那么服务器端验证也是必要的(并且通常还是推荐使用)。
【解决方案2】:

在提交表单时设置条件,并添加对表单提交的检查。 jQuery 中的示例:

$('form').submit(function(e) { 

    // If form has been submitted
    if($(this).data('submitted') == true) {
        e.preventDefault();
        return;
    }

    // Set the condition
    $(this).data('submitted',true);

    //...

    //After form has been submitted successfully, release the condition
    $(this).data('submitted',false);
});

这比禁用表单的某些部分更可取,因为可以从表单中的任何输入进行提交。

【讨论】:

    【解决方案3】:

    第一件事是,如果您担心由于绕过客户端控件(即使用 Firebug 或 Fiddler 重新发出请求)而导致多次提交,您可以忘记在客户端应用控件的任何选项(即禁用按钮,JS 检查提交状态等)。这是您必须在服务器上处理的问题。

    看看synchroniser token pattern。这通常用于帮助防止 CSRF(链接中的上下文也是如此),但它也用于避免多次提交表单。如果您可以在 AJAX 请求中传递一个令牌,该令牌在请求开始处理后(显然是在繁重的工作开始之前)经过验证然后失效,那么您就有了一种防止多次提交的方法。

    【讨论】:

      猜你喜欢
      • 2012-07-03
      • 2021-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多