停止重复提交或双击提交

时间:2013-11-21 20:07:30

标签: php forms laravel form-submit

首先,我意识到还有其他问题与此类似,但它们并没有包含任何明确解决我问题的方法。

当客户提交订单时,我需要能够正确阻止我的处理脚本针对该特定订单多次运行。

/payment - 客户填写所有详细信息并提交订单

/process_order - 收集所有数据并处理订单。

发生的事情是我的订单正在被部分处理然后再次完全处理...我只能假设这是因为客户要么双击提交按钮,要么点击提交按钮一秒钟时间,因为该过程尚未完成,浏览器尚未重定向到“谢谢”页面......

我可以使用jQuery在第一次点击事件时禁用按钮,但我也想知道我可以在服务器端做什么来防止这种情况发生。

2 个答案:

答案 0 :(得分:2)

一种可能的解决方案是为表单创建一个nonce令牌,并在显示表单时将其存储在会话中。

$_SESSION['formNonce'] = md5( time() . uniquid() );

生成表单时,将其添加为隐藏字段:

<input type="hidden" name="formNonce" value="<?php echo($_SESSION['formNonce']); ?>">

然后在处理它时,首先要做的是验证nonce是否在会话中,然后将其删除。这样,第二次提交将不会通过验证,因为已删除了nonce令牌。

所有这些都会有一些调整和错误检查,但加上javascript按钮禁用可能是一个可行的解决方案。

答案 1 :(得分:0)

例如,您可以使用“防伪tockens”方法。用户访问页面后,会分配一个tocken。首次尝试提交页面将从有效列表中删除tocken,以便进一步尝试失败。