2011-05-11 33 views
4

如果用户不断点击提交按钮,我会如何防止用户多次发布相同的数据到该操作?在asp.net mvc应用程序中阻止多个POST

我知道在PHP中,有一种方法来防止这种多次提交,但我没有看到任何的asp.net mvc。有没有?

+0

见http://stackoverflow.com/questions/888965/what-methods-are-available-to-stop-multiple-post-of-a-form-in-asp-net-mvc – 2011-05-11 17:14:55

+0

[Prevent double form submission]的可能重复(http://stackoverflow.com/questions/9803286/prevent-double-form-submission) – 2016-04-26 09:24:14

回答

6

您可以使用javascript来禁用提交按钮。例如使用jQuery:

$(function() { 
    $('form').submit(function() { 
     $('#idofsubmitbutton').attr('disabled', 'disabled'); 
    }); 
}); 

不过请注意,这可能不是100%可靠的,例如用户可以禁用了Javascript,甚至更糟:他可能有恶意的意图和自动化HTTP POST请求。

+0

这总是一件好事,但它并不是万无一失的,尤其是当你的用户是恶意的时候, – 2011-05-11 16:53:14

+0

@Robert Harvey,当然,我应该在我的回答中提到这一点。 – 2011-05-11 16:54:05

+0

所以我应该为整个网站的所有表单制作通用的? – 2011-05-11 17:21:59

2

最佳实践是实施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。

+2

尽管PRG模式很好并且应该使用,但如果其中的“P”操作需要时间(通常是这种情况),用户可以再次单击提交按钮并使用相同的方法启动第二次调用此操作数据为第一。 – 2011-05-11 16:58:35

4

您正在寻找的Post-Redirect-Get Strategy

禁用提交按钮不会阻止F5刷新。

+4

虽然PRG模式很好并且应该使用,但是如果其中的P动作需要时间(通常是这种情况),则用户可以再次单击提交按钮,并以与首先。 – 2011-05-11 16:58:43

+0

我们同时使用PRG和禁用方法以避免此问题提供javascript未禁用 – Tassadaque 2011-05-11 20:28:17

0

这是this question重复,但我在这里发布我的答案,以供参考...

的PRG模式不会阻止这一点,因为在它的P动作需要一定的时间(通常情况下)并且用户可以再次提交表单(通过点击或浏览器刷新),这将导致PRG模式“失败”。

请注意,恶意用户也可以通过快速连续运行多个http帖子来绕过所有客户端措施。

以上所有的解决方案是使用以下方法检查服务器端的重复提交,如我所述,here

我引述:

“如果你使用一个隐藏的防伪标记在你的形式(如你 应该),你可以令牌缓存防伪上首次提出并 删除如果需要,则从缓存中取得令牌,或在设定的时间量后超时缓存的条目 。

然后,您将能够与对缓存 每个请求检查的具体形式是否已经提交并拒绝它,如果它了。”