Coldfusion - 如何防止多次点击?

Coldfusion - How to prevent multiple clicks?

我有一个按钮(锚标记),如果您按下它,它会发送一条确认消息。 问题是,例如,如果您快速按下它 5 次,它将发送 5 条确认消息,如果您按下它 2 次,它将发送 2 条消息。

当用户的连接速度较低并且在刷新页面时他再次按下按钮时可能会发生这种情况。

我该如何处理这种情况?我虽然想禁用按钮,但由于其他原因,这是不可能的。

<a class="msg" href="/manage/conversations.cfm?destination=#destination#">
        #ucase(request.l('Send'))#
</a>

感谢您的宝贵时间

最好的方法是在选择 link 后将其禁用。如果您不想这样做,另一种方法是像这样构造 conversations.cfm。

<div id="pageContent">
small amount of text
</div>
<cfflush>
</body>
</html>

<cfsavecontent variable = "actualPageContent">
code
</cfsavecontent>

<cfoutput>
<script>
var #toScript(actualPageContent, "newPageContent")#; 
document.getElementById("pageContent").innerHTML = "newPageContent";
</script>
</cfoutput>

最终,您需要在服务器上安装代码以防止多次处理来自同一用户的 link。

但是,要解决 UI 问题,您是否 link 调用函数而不是直接调用 cf 文件。

<a class="msg" href="javascript: processLink(#destination#);">
        #ucase(request.l('Send'))#
</a>

<script>
runCount = 0;

function processLink(destination){
runCount++;

if (runCount == 1){
 window.location.href = "/manage/conversations.cfm?destination=" + destination;
}

}
</script>

如前一个答案所述,最好有一些客户端 javascript 来阻止触发快乐用户的重复提交,但是您也应该检查服务器端。

一种方法是创建一个带有 GUID 的隐藏表单域,该 GUID 在 coldfusion 呈现您的表单时生成。

所以像这样:

<cfset GUID = createUUID()>

<cfoutput>
<form id="frm" action="/target.cfm" method="post">
<input type="hidden" name="guid" value="#GUID#">
<!-- all your formfields go here -->
<input type="submit">
</form>
</cfoutput>

然后在服务器端,目标页面检查它之前是否已经收到 GUID。方法有很多种,这里介绍其中的两种。

a) 使用会话范围。

如果您不在集群环境中 运行 并且只需要快速处理小型应用程序,这可能是最快的方法。

<cfif isDefined("session.MYPAGE_GUID") AND session.MYPAGE_GUID EQ form.guid>
<cfoutput>Duplicate Form Submission</cfoutput>
<cfabort>
<cfelse>
<cfset session.MYPAGE_GUID = form.guid>
<!-- Do Business Logic Here -->
</cfif>

b) 使用数据库 Table. 使用名为 GUID 的列创建数据库 table。请确保 GUID 是主键或具有唯一约束。

在您 运行 您的业务逻辑之前,将 form.GUID 插入数据库 table。如果您可以执行插入过程您的业务逻辑,否则数据库查询将抛出记录存在的错误。然后您可以捕获此错误并对重复提交采取适当的操作。

我更喜欢数据库选项,因为它适用于集群环境,并且数据库服务器可以可靠地防止竞争条件,以确保只设置一次 GUID。

请注意,这只是演示基本概念,而不是解决方案。要将这些概念纳入电子商务解决方案,还有一些工作要做。