asp.net-mvc - 在 ASP.NET MVC 中,有哪些方法可以停止表单的多次回发?

标签 asp.net-mvc postback submit action-filter

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

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

我认为的可能性是:

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

还有更多吗?

其中有一些具体的实现吗?

我可以看到第三个选项被实现为带有 HtmlHelper 扩展的 ActionFilter,其方式与防伪功能类似。

期待收到你们 MVC 人员的来信。

最佳答案

人们常常忽视处理这个问题的最传统方法,即使用随机数键

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

我喜欢 Javascript 解决方案,因为它大多数都可以工作。

随机数键但是,它始终有效。随机数 key 是由服务器生成的随机唯一 GUID(也保存在数据库中)并嵌入到表单中。当用户发布表单时,随机数键也会被发布。一旦 POST 进入服务器,服务器就会验证其数据库中是否存在随机数 key 。如果是,服务器将从数据库中删除该 key 并处理该表单。因此,如果用户 POST 两次,则不会处理第二次 POST,因为在处理第一个 POST 后,随机数 key 已被删除。

随机数 key 还有一个额外的优势,它可以通过防止 replay attacks 带来额外的安全性。 (中间的人嗅探您的 HTTP 请求,然后将其重播到服务器,服务器将其视为合法)。

关于asp.net-mvc - 在 ASP.NET MVC 中,有哪些方法可以停止表单的多次回发?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/888965/

相关文章:

file - 如何提交非英文文件?

javascript - 如何让 Javascript 调试与我的 ASP.NET MVC 应用程序一起工作?

ASP.NET 回发和后退按钮

jquery - 更改表单的 'action'

validation - 如何保留 f :viewParam values after postback with validation failed

c# - Repeater 中的 LinkBut​​ton 会导致回发,而按钮则不会

html - 表单 - 如果输入字段中的文本被删除,用户仍然可以点击提交

asp.net-mvc - Glass Mapper未加载的模型

c# - Entity Framework - 检查挂起的迁移

c# - NLog - 删除早于 X 天的日志