如何防止“确认表单重新提交”对话框?

如何在提交后清除表单中的信息,以便在页面刷新后不显示此错误?

查看图片(来自chrome):

该对话框包含以下文字:

您正在寻找的页面
您输入的信息。 回到那个
页面可能会导致您采取的任何操作
重复。 你想继续吗?

我希望这个对话框不会出现。

编辑:自从我最初发布这个答案以来已经过去了几年,尽管我得到了一些赞成,但我对之前的答案并不满意,所以我完全重做了。 我希望这有帮助。


何时使用GETPOST

摆脱此错误消息的一种方法是使您的表单使用GET而不是POST 。 请记住,这并不总是一个合适的解决方案 (请参阅下文)。

如果您正在执行不想重复的操作,传输敏感信息或表单包含文件上载或发送的所有数据长度超过~2000个字符 ,请始终使用POST

何时使用POST示例包括:

  • 登录表单
  • 联系表格
  • 提交付款表格
  • 添加,编辑或删除数据库中的条目的东西
  • 图像上传器(注意,如果使用带有字段的GET ,则只会将文件名发送到服务器,99.73%的时间不是您想要的。)
  • 包含许多字段的表单(如果使用GET,将创建一个长URL)

在任何这些情况下,您都不希望人们刷新页面并重新发送数据。 如果您要发送敏感信息,使用GET不仅不合适,这将是一个安全问题( 即使表单是由AJAX发送的 ),因为敏感项目(例如用户的密码)是在URL中发送的,因此会出现在服务器访问日志中。

使用GET基本上是其他任何东西。 这意味着,当您不介意重复时,对于您可以提供直接链接的任何内容,当没有传输敏感信息时,当您非常确定您的URL长度不会失控时当您的表单没有任何文件上传时。

例子包括:

  • 在搜索引擎中执行搜索
  • 用于在网站上导航的导航表单
  • 使用随机数或单次使用密码(例如电子邮件中的“取消订阅”链接)执行一次性操作。

在这些情况下,POST将是完全不合适的。 想象一下,如果搜索引擎使用POST进行搜索。 每次刷新页面时都会收到此消息,而您无法将结果URL复制并粘贴给用户,他们必须自己手动填写表单。

如果您使用POST

对我来说,在大多数情况下,即使弹出“确认表单重新提交”对话框,也会显示存在设计缺陷。 由于POST本质是用于执行破坏性操作,因此Web设计人员应该通过意外(或有意)刷新页面来防止用户多次执行它们。 许多用户甚至不知道此对话框的含义,因此只需单击“继续”即可。 如果那是在“提交付款”请求之后怎么办? 付款是否会再次发送?

所以你会怎么做? 幸运的是,我们有Post / Redirect / Get设计模式。 用户向服务器提交POST请求,服务器将用户的浏览器重定向到另一个页面,然后使用GET检索该页面。

这是一个使用PHP的简单示例:

 if(!empty($_POST['username'] && !empty($_POST['password'])) { $user = new User; $user->login($_POST['username'], $_POST['password']); if ($user->isLoggedIn()) { header("Location: /admin/welcome.php"); exit; } else { header("Location: /login.php?invalid_login"); } } 

请注意,在此示例中,即使密码不正确 ,我仍然会重定向回登录表单。 要向用户显示无效的登录消息,请执行以下操作:

 if (isset($_GET['invalid_login'])) { echo "Your username and password combination is invalid"; } 

它与您的表单或其中的值无关。 它被浏览器触发,以防止用户使用缓存数据重复相同的请求。 如果您确实需要启用结果页面的刷新,则应该通过PHP( header('Location:result.php'); )或您正在使用的其他服务器端语言重定向用户。 元标记解决方案也应该用于在刷新时禁用重新发送。

处理POST页面后,将用户重定向到同一页面。

http://test.com/test.php

 header('Location: http://test.com/test.php'); 

这将摆脱框,因为刷新页面将不会重新提交数据。

我有一种情况,我无法使用上述任何答案。 我的案例涉及使用搜索页面,如果在导航到任何搜索结果后点击返回,用户将获得“确认表单重新提交”。 我编写了以下javascript来解决这个问题。 它不是一个很好的修复,因为它有点眨眼,它在IE8或更早版本上不起作用。 尽管如此,对于处理此问题的人来说,这可能是有用的或有趣的。

 jQuery(document).ready(function () { //feature test if (!history) return; var searchBox = jQuery("#searchfield"); //This occurs when the user get here using the back button if (history.state && history.state.searchTerm != null && history.state.searchTerm != "" && history.state.loaded != null && history.state.loaded == 0) { searchBox.val(history.state.searchTerm); //don't chain reloads history.replaceState({ searchTerm: history.state.searchTerm, page: history.state.page, loaded: 1 }, "", document.URL); //perform POST document.getElementById("myForm").submit(); return; } //This occurs the first time the user hits this page. history.replaceState({ searchTerm: searchBox.val(), page: pageNumber, loaded: 0 }, "", document.URL); }); 

我有同样的问题,

这对我有用,

 echo(""); 

看来你正在寻找Post/Redirect/Get模式。

作为另一种解决方案,您可以停止使用重定向。

您可以在没有POST确认警报的情况下立即处理和呈现处理结果。 您应该只是操纵浏览器历史记录对象:

 history.replaceState("", "", "/the/result/page") 

查看完整或简短的答案

您可以尝试使用jQuery进行AJAX调用。 就像youtube如何添加您的评论而不刷新。 这将解决整个刷新的问题。

您需要通过ajax调用发送必要的信息。
我将以youtube评论为例。

 $.ajax({ type: 'POST', url: 'ajax/comment-on-video.php', data: { comment: $('#idOfInputField').val(); }, success: function(obj) { if(obj === 'true') { //Some code that recreates the inserted comment on the page. } } }); 

您现在可以创建文件comment-on-video.php并创建如下内容: