【发布时间】:2011-05-11 16:48:34
【问题描述】:
如果用户不断点击提交按钮,我如何防止用户多次向操作发布相同的数据?
我知道在 php 中有一种方法可以防止这种多次提交,但我没有看到任何用于 asp.net mvc 的方法。有吗?
【问题讨论】:
如果用户不断点击提交按钮,我如何防止用户多次向操作发布相同的数据?
我知道在 php 中有一种方法可以防止这种多次提交,但我没有看到任何用于 asp.net mvc 的方法。有吗?
【问题讨论】:
您可以使用 javascript 禁用提交按钮。 jQuery 示例:
$(function() {
$('form').submit(function() {
$('#idofsubmitbutton').attr('disabled', 'disabled');
});
});
但是请注意,这可能不是 100% 可靠的,例如用户可能禁用了 javascript,甚至更糟:他可能有恶意并自动执行 HTTP POST 请求。
【讨论】:
您正在寻找Post-Redirect-Get Strategy
禁用提交按钮不会阻止 F5 刷新。
【讨论】:
最佳实践是实现 PRG (http://en.wikipedia.org/wiki/Post/Redirect/Get) 模式,我在 aspnet mvc http://weblogs.asp.net/rashid/archive/2009/04/01/asp-net-mvc-best-practices-part-1.aspx 上有一篇关于此主题的旧帖子@ 检查 #13。
【讨论】:
P 操作需要时间(通常是这种情况),用户可以再次单击提交按钮并启动第二次使用与第一个相同的数据调用此操作。
这是this question 的副本,但我在这里发布我的答案以方便参考...
PRG 模式不会阻止这一点,因为其中的 P 动作需要时间(通常是这种情况)并且用户可以再次提交表单(通过单击或浏览器刷新),这将导致 PRG 模式“失败”。
请注意,恶意用户还可以通过快速连续运行多个 http 帖子来绕过您的所有客户端措施。
上述所有问题的解决方案是使用以下方法检查服务器端的重复提交,如我本人所述,here。
我引用:
“如果您在表单中使用隐藏的防伪令牌(当您 应该),您可以在首次提交时缓存防伪令牌并 如果需要,从缓存中删除令牌,或使缓存条目过期 在设定的时间后。”
然后,您将能够根据缓存检查每个请求 特定表单是否已提交,如果已提交则拒绝。”
【讨论】: