我有一个按钮(锚标记),如果你按下它就会发送确认信息。 问题是,例如,如果你非常快地按下它5次,它将发送5条确认信息,如果按2次它将发送2条信息。
当用户连接速度较慢且页面刷新时,可能会再次按下按钮。
我该如何处理这种情况?我虽然禁用了按钮,但由于其他原因,这是不可能的。
<a class="msg" href="/manage/conversations.cfm?destination=#destination#">
#ucase(request.l('Send'))#
</a>
感谢您的时间
答案 0 :(得分:7)
最终,您需要在服务器上安装代码,以防止从同一用户多次处理链接。
但是,要解决UI问题,请直接链接调用函数而不是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>
答案 1 :(得分:2)
正如前面的回答中所提到的,有一些客户端javascript可以阻止触发快乐用户的重复提交,但是你也应该检查服务器端。
一种方法是使用GUID创建一个隐藏的表单字段,当coldfusion呈现表单时,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)使用数据库表。 使用名为GUID的列创建数据库表。确保GUID是主键或具有唯一约束。
在运行业务逻辑之前,将form.GUID插入数据库表。如果您可以执行插入过程您的业务逻辑,如果不是,数据库查询将抛出记录存在的错误。然后,您可以捕获此错误并采取适当的操作进行重复提交。
我更喜欢数据库选项,因为它可以跨群集环境工作,数据库服务器可以防止竞争条件,以确保GUID只设置一次。
请注意,这只是展示基本概念,而不是解决方案。将这些概念纳入电子商务解决方案还有一些工作要做。
答案 2 :(得分:-2)
最好的方法是在链接被选中后禁用它。如果您不想这样做,另一种方法是构建像这样的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>