6

我想知道我可以使用哪些技术来避免用户在刷新页面并再次选择提交时两次发布表单?

例如,我在regiter.php中有表格,并在register.php 中处理它。

第一次我可以在另一个文件中处理,例如register_process.php并重定向到 register.php,但是我必须创建大约 20 个新页面并重新定位大量代码,我不想要那个选项。

第二,我可以玩,headers我不记得确切的技巧,但有一些糟糕的体验 - 用户在刷新页面后看到旧数据......

第三,我可以在成功后重定向到一些dummy.php并从dummy.php跳转回register.php然后即使他们刷新页面浏览器也不会重新发布,但是它不能使用后退按钮并选择重新来防止他们发布,我知道我可以使页面过期,但我发现我和其他用户可能会看到页面过期错误的烦人体验。

第四,在页面加载后为每个表单使用一些唯一的“访问密钥”,该页面将与表单一起发布,并且一旦使用就不能重复使用,但是我对该功能的逻辑有点挣扎。如何知道密钥在没有存储在 MySQL DB 的情况下被使用,我认为基于时间的访问也不是很好,因为有些用户在页面打开和表单提交之间可能需要很长时间。

我需要更多关于如何避免用户再次提交表单的建议。

4

5 回答 5

3

试试这个:

<?php
session_start();
if( strcasecmp($_SERVER['REQUEST_METHOD'],"POST") === 0) {
  $_SESSION['postdata'] = $_POST;
  header("Location: ".$_SERVER['PHP_SELF']."?".$_SERVER['QUERY_STRING']);
  exit;
}
if( isset($_SESSION['postdata'])) {
  $_POST = $_SESSION['postdata'];
  unset($_SESSION['postdata']);
}

这基本上会保存 POST 数据并导致浏览器重新请求为 GET 请求。

于 2012-12-15T04:25:02.893 回答
1

第五。使用 AJAX 或 jQuery,当在页面上单击表单时,在后台提交该数据。向屏幕输出响应。将该表单标记为已提交,或保存到会话中,当他们刷新时,他们将无法再次提交表单。

在我看来,无论如何,这是最好的方法。我有一个包含 20 个或更多表格的记分牌,它可以很好地发送数据而无需刷新。您可以返回响应并使页面看起来非常专业。使用 jQuery,您还可以使用一些很棒的表单验证来确保他们正在提交所需的字段。

于 2012-12-15T04:12:32.270 回答
1

我认为最好的解决方案是这样的:
* 创建一个 md5 或 base64 的已发布数据
* 将此哈希与会话变量进行比较(我们称之为 $_SESSION['repost'])
* 如果哈希匹配,则跳过此保存应该做并输出警告
* 如果哈希不匹配,或者哈希不存在
* 用当前哈希分配会话变量
* 做任何保存应该做的事情

于 2016-01-04T14:41:34.797 回答
0

当您考虑第一个选项时,我不知道您网站的设计(编程设计^^),但您应该只需要一页。假设您使用所有参数调用redirect.php,您应该调用您的控制器,并且您的控制器应该知道无论参数如何处理它们。

在编程时能够进行一些抽象和良好的设计是一个好习惯,在这种情况下它有很大帮助。

于 2012-12-15T04:22:29.107 回答
0

另一种方法是将最后一个帖子存储在会话变量中,并检查是否相等,如下所示:

<?php
... program ...
if ($_SESSION['PREPOST'] == $_POST) {
    // DO SOMETHING
}
... program ...
$_SESSION['PREPOST'] = $_POST;
?>
于 2017-11-29T16:35:42.907 回答