如何通过浏览器刷新来防止重复发布?

3
以下代码能否防止用户在提交表单后,点击浏览器刷新按钮造成重复插入数据库的问题?
<?php
    if( $_SERVER['REQUEST_METHOD']=='POST' ) {

        try {
            // write to database
        } catch($e) {
            // error reporting
        }
    }
?>
4个回答

13

4
不行,因为如果他们点击刷新按钮(或者后退/前进,无论什么),浏览器将尝试再次进行POST。你需要的是Post/Redirect/Get模式。请注意,这只能通过导航来防止重复提交。如果要防止多次单击表单提交而产生重复提交,则必须使用JavaScript在提交期间以某种方式禁用按钮。
一些代码:
<?php
   if ('POST' == $_SERVER['REQUEST_METHOD']) {
      //do processing
      //303 forces a GET request
      header("Location: thank-you-page", true, 303);
      exit;
   }
   else {
      //handle bad page visit.
   }
?>

2

我没有看到任何代码可以区分首次发帖和重复发帖。你应该在处理POST后将浏览器重定向到不同的URL,这样如果他们按下刷新按钮,他们不会刷新表单的目标并再次进行POST。


2

你应该使用Dan Grossman的方法,在POST操作后始终进行重定向。另外,这是另一种选项,它增加了额外的安全性:

在您的表单中添加一个一次性令牌,并将其保存到$_SESSION变量中。然后,如果它被使用(表单已提交),请从会话中删除它(或创建一个新的令牌)。如果表单再次发送,则两个令牌不匹配,您就有了重复的条目(例如可以忽略第二个)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接