停止重复提交或双击提交



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

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

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

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

现在的情况是,我的订单被部分处理,然后又被完全处理。。。我只能假设这是因为客户要么双击提交按钮,要么第二次点击提交按钮,因为过程尚未完成,浏览器还没有重定向到"谢谢"页面。。。

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

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

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

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

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

然后在处理它时,你要做的第一件事就是验证nonce是否在会话中,然后将其删除。这样,第二次提交就不会通过验证,因为nonce令牌已经被删除。

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

例如,您可以使用"防伪tockens"方法。一旦用户访问了一个页面,就会分配一个tocken。第一次尝试提交页面将从有效列表中删除tocken,因此进一步的尝试将失败。

最新更新