在asp.net mvc应用程序中防止多个POST

时间:2011-05-11 16:48:34

标签: asp.net-mvc asp.net-mvc-3

如果用户不断点击提交按钮,如何阻止用户多次向操作发布相同的数据?

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

4 个答案:

答案 0 :(得分:6)

您可以使用javascript停用提交按钮。 jQuery示例:

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

但请注意,这可能不是100%可靠,例如用户可能禁用了javascript甚至更糟:他可能有恶意意图并自动执行HTTP POST请求。

答案 1 :(得分:4)

您正在寻找Post-Redirect-Get Strategy

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

答案 2 :(得分: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。

答案 3 :(得分:0)

这是this question的副本,但我在这里发布我的答案以便于参考......

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

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

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

我引用:

  

“如果您在表单中使用隐藏的防伪标记(就像您一样)   应该),你可以在第一次提交时缓存防伪标记   如果需要,从缓存中删除令牌,或使缓存的条目到期   经过一段时间后。“

     

然后,您将能够针对缓存检查每个请求   具体表格是否已提交,如果有,则予以拒绝。“