防止重新提交表单

Ema*_*sev 104 forms http

第一页包含HTML表单.第二页 - 处理提交数据的代码.

第一页中的表单已提交.浏览器被重定向到第二页.第二页处理提交的数据.

此时,如果第2页被刷新,则会弹出"确认表单重新提交"警告.

这可以预防吗?

Cod*_*ice 144

人们过去常常采用两种方法:

方法1:使用AJAX +重定向

这样,您可以使用JQuery或类似于Page2的方式在后台发布表单,同时用户仍会看到显示的page1.成功发布后,您将浏览器重定向到Page2.

方法2:发布+重定向到自己

这是论坛上的常用技巧.Page1上的表单将数据发布到Page2,Page2处理数据并执行需要完成的操作,然后对自身执行HTTP重定向.这样,浏览器记住的最后一个"动作"是第2页上的简单GET,因此在F5上不会重新提交表单.

  • 方法2的变体是重定向到另一页面.例如,您发布到http://example.com/save.html,保存完成后,您将重定向到http://example.com/list.html. (2认同)

Ang*_*dar 22

你需要使用PRG - Post/Redirect/Get模式,你刚刚实现了PR的P.你需要重定向.(现在几天你根本不需要重定向.见这个)

PRG是一种Web开发设计模式,可以防止一些重复的表单提交,这意味着,提交表单(发布请求1) - >重定向 - >获取(请求2)

Under the hood
Run Code Online (Sandbox Code Playgroud)

重定向状态代码 - 带有HTTP 302的HTTP 1.0或带有HTTP 303的HTTP 1.1

具有重定向状态代码的HTTP响应还将在位置标题字段中提供URL.通过具有该代码的响应来邀请用户代理(例如,web浏览器),以对位置字段中指定的新URL做出第二个(否则相同的)请求.

重定向状态代码是为了确保在这种情况下,Web用户的浏览器可以安全地刷新服务器响应,而不会导致重新提交初始HTTP POST请求.

Double Submit Problem
Run Code Online (Sandbox Code Playgroud)

双提问题

Post/Redirect/Get Solution
Run Code Online (Sandbox Code Playgroud)

发布/重定向/获取解决方案

资源

  • 很好的解释.我想知道如果用户在重定向后点击浏览器上的后退按钮会发生什么.是否会再次显示"确认表格重新提交"弹出窗口.我猜即使确认弹出窗口没有再显示,第1页上的帖子请求会再次发出相同的数据,再次将用户重定向到第2页.我有一系列表单,form1,form2,form3.怎么能从形式"n"回到无缝形成"n-1".随机问题:你在哪里研究PRG设计模式 (2认同)

dav*_*vin 10

直接,你不能,这是一件好事.浏览器的警报是有原因的.这个帖子应该回答你的问题:

阻止后退按钮显示POST确认警报

建议的两个关键解决方法是PRG模式,以及AJAX提交,然后是脚本重定位.

请注意,如果您的方法允许GET而不是POST提交方法,那么这既可以解决问题,又可以更好地适应约定.这些解决方案是在您想要/需要POST数据的假设下提供的.


Blr*_*rfl 7

100%确保同一表单永远不会被提交两次的唯一方法是在您发出的每个表单中嵌入一个唯一标识符,并跟踪在服务器上提交的标识符.存在的缺陷是,如果用户备份到表单所在的页面并输入新数据,则相同的表单将不起作用.


iwe*_*ein 6

答案分为两部分:

  1. 确保重复的帖子不会弄乱服务器端的数据.为此,请在帖子中嵌入唯一标识符,以便您可以拒绝服务器端的后续请求.这种模式在消息传递术语中称为Idempotent Receiver.

  2. 确保用户不会被两者重复提交的可能性所困扰

    • POST后重定向到GET(POST重定向GET模式)
    • 使用javascript禁用按钮

你在2.下做的任何事情都不会完全阻止重复的提交.人们可以非常快地点击,黑客无论如何都可以发帖.你总是需要1.如果你想绝对确定没有重复.


noo*_*mer 6

您可以使用replaceStateJQuery的方法:

<script>
   $(document).ready(function(){
   window.history.replaceState('','',window.location.href)
   });
</script>
Run Code Online (Sandbox Code Playgroud)

这是防止数据提交后由于回发而再次提交的最优雅的方式。

希望这可以帮助。