有哪些方法可以在ASP.NET MVC中停止多个表单回发?

Woo*_*Bob 20 asp.net-mvc postback submit action-filter

常见的Web问题是用户多次单击表单的提交按钮,因此服务器不止一次地处理表单.当用户点击已提交表单的后退按钮并因此再次处理时,也会发生这种情况.

什么是阻止ASP.NET MVC发生这种情况的最佳方法?

我认为的可能性是:

  1. 提交后禁用该按钮 - 这会绕过多次点击而不是导航
  2. 让接收操作立即重定向 - 浏览器似乎将这些重定向保留在历史记录之外
  3. 在会话和表单中放置一个唯一的标记 - 如果它们匹配处理表单 - 如果不清除表单以进行新提交

还有更多吗?

是否有任何特定的实现?

我可以看到第三个选项被实现为具有HtmlHelper扩展的ActionFilter,其方式与防伪内容类似.

期待收到MVC'ers的消息.

ale*_*emb 16

通常人们会忽略最常用的处理方法,即使用随机数键.

您可以像其他人提到的那样使用PRG,但PRG的缺点是它无法解决双击问题,它需要额外的服务器进行重定向,因为最后一步是GET请求你不要t可以直接访问刚刚发布的数据(尽管它可以作为查询参数传递或在服务器端维护).

我喜欢Javascript解决方案,因为它大部分时间都可以使用.

然而,Nonce键一直在工作.随机数密钥是由服务器生成的随机唯一GUID(也保存在数据库中)并嵌入在表单中.当用户POST表单时,nonce键也会被发布.一旦POST进入服务器,服务器就会验证其数据库中是否存在nonce密钥.如果是,则服务器从数据库中删除密钥并处理该表单.因此,如果用户POST两次,则不会处理第二个POST,因为在处理第一个POST后删除了nonce密钥.

nonce密钥具有额外的优势,它通过防止重放攻击带来额外的安全性(中间的人嗅探您的HTTP请求,然后将其重放到将其视为合法的服务器).


moo*_*000 5

您应该始终将重定向作为HTTP响应返回到POST.当用户使用浏览器中的前进/后退按钮来回导航时,这将阻止POST再次发生.

如果您担心用户双击提交按钮,只需要一个小脚本在提交时立即禁用它们.