PHP双击困境

时间:2014-03-04 13:02:51

标签: javascript php double-click

我们遇到问题,用户双击我们的应用程序中的按钮,从屏幕进入屏幕。

我们已经在按钮上实现了(onclick="this.disabled=true"),但我们确信停止快速双击是不够的。

一个简单的例子: -

屏幕A有四个输入字段和一个继续按钮。按下继续按钮后,控制权将传递到服务器端例程以验证信息,设置一些会话变量并调用屏幕B.

偶尔会发生的事情是: -

首次单击时,将调用服务器端例程并开始验证信息并设置会话变量。第二次单击控制并再次调用服务器端例程并开始验证信息并设置会话变量 - >对我们来说,会话​​变量已经设置,这突出了问题。

我们已经查看了令牌,但认为它们不会解决我们的问题。

我们认为,由于每个PHP应用程序都必须容易受到这种双击问题的影响,因此必须有一个解决它的标准方法,但我们还没有找到。

如果您已经解决了这个问题,那么如果您想就我们如何克服这个问题提供一些见解,我们将不胜感激。

* 感谢您的回复。 Loic和Brian Nickel - 很难分开,因为两者都通过时间戳或GUID进行令牌方法。我们将不得不回过头来再看看代币。经过讨论 - 作为我们的首选解决方案,我们将采用GUID令牌概念。

3 个答案:

答案 0 :(得分:6)

由于双击基本上会提交两次相同的表单,因此您可以检查两个提交之间的时间戳。

我将以stackoverflow为例,因为这个网站很棒。

假设我在服务器端投票了这个问题,如果我的POST请求有效,那么我的POST请求将被处理并保存。

然后服务器端,在处理请求之前,他们将检查在最后几秒内是否还没有发布相同的表单(不是吗?)。

无论如何,我的观点是,给你的表单一个名字,并在验证时,在你的用户会话中加上一个时间戳,这样你就可以在规定的时间内拒绝同一表格的帖子。

祝你好运。

答案 1 :(得分:2)

这是一个非常常见的问题,有一个相当标准的解决方案。无论何时生成表单,都应该生成一个像GUID这样的唯一标记,并将其粘贴在SQL,redis,memcached,会话或任何短期持久存储中。把它粘在一个隐藏的领域。您应该为每个生成的表单执行一个标记。

表单提交后,以原子方式检查并从商店中删除令牌。如果它在那里表格是第一次提交。如果没有,那就是重复。

对于奖励积分,您可以使用成功的结果数据存储令牌,并使用它来呈现与他们点击一次时相同的成功页面,而不是在第二次提交时显示错误。

答案 2 :(得分:1)

1)在按钮的z-top上放置一个隐藏的div(或其他元素)(不透明度:0.01)

2)一旦点击(mousedown)删除div

或:

1)点击后删除点击事件