PHP清除浏览器缓存以避免刷新后重新发送表单数据

Posted

技术标签:

【中文标题】PHP清除浏览器缓存以避免刷新后重新发送表单数据【英文标题】:PHP clear browser cache to avoid form data resend after refresh 【发布时间】:2011-05-10 22:33:28 【问题描述】:

我正在开发一个 php-mysql 应用程序,它允许注册用户输入文本 cmets。问题是:

    用户登录网站 - 好的 向用户展示了提交文本评论的表单 - 好的 用户输入文本评论并提交 - OKAY 我有一个例程来清理评论并将其保存到 MySQL(使用用户 ID、文本评论、日期时间戳)并向用户展示他/她的评论已输入 - 好的 用户决定刷新浏览器 - 输入了重复的评论 - 错误!

我在想 3 个选项:

选项 1:检查例程:上次用户发表评论,如果是,检查是否重复。如果重复,则显示错误消息。 选项 2:不允许用户过快发帖的例程。所以基本上不允许1分钟左右的cmet发帖。因此,如果刷新浏览器,评论将被忽略。 选项 3:操作浏览器缓存以清除其内容,以便在刷新时不会输入重复内容。

现在在我的应用程序的上下文中,我对 OPTION 1 和 OPTION 2 的关注是 PHP-MySQL 的性能,因为我已经在同一个页面中有各种查询来从数据库推送/获取数据。所以选项 3 可能针对不同的问题。

问题是:如果我选择选项 3,这是否可以视为最佳实践?意思是清除浏览器缓存是最好最有效的解决方案?我读过也有后果吗?感谢您的想法!

【问题讨论】:

【参考方案1】:

在您将发布的变量插入数据库后,只需取消设置它

<?php
    if(isset($_POST["comment"]))
        //store in the database
        //on successful storage
        unset($_POST["comment"]);
    
?>

因此,当用户刷新页面时,该值不会被回传...

【讨论】:

这不起作用 - 数据存储在浏览器中并且取消设置不会有帮助(我希望它会......重定向意味着时间......) 对我来说,在成功登录后立即取消设置后数据就可以了。然后,如果用户在浏览器历史记录中退后一步,数据就会丢失并且浏览器无法找到。工作完成;)【参考方案2】:

我找到了新方法试试这个。

   function PreventResendData($invalidpage='index.php')

    if(   $_POST && !is_array( $_SESSION['post_var'] )   ) 

        $_SESSION['post_var'] = $_POST;
        header('location:'.$_SERVER['PHP_SELF']);

    
    else if($_SESSION['post_var'])
    
        $_POST = $_SESSION['post_var']; 
        $_SESSION['post_var'] = '';
    
    else
    
        header("location:".$invalidpage);
    


【讨论】:

【参考方案3】:

将数据输入数据库后,使用 header 或 location.href 重定向页面

【讨论】:

【参考方案4】:

只需在将数据提交到数据库后进行重定向。这是一种常见的做法。

http redirect 指示浏览器为指定的 url 发出 http GET(与用于提交表单的 http POST 相反)。如果您在将数据插入数据库后立即执行此操作,则当用户刷新浏览器时,除了再次看到相同的页面外,什么都不会发生。

This question on SO 告诉你如何用 php 重定向。

【讨论】:

对不起,我的无知,重定向是什么意思? 重定向意味着发送 HTTP 状态 302。查看 PHP 文档以了解标头方法:php.net/manual/en/function.header.php - 搜索“位置:” 明白了,所以我会在插入数据后立即重定向到同一页面。现在,这可以从“后退”按钮覆盖我吗?意思是用户点击返回并重新提交? @Thilo: 303 将是 POST 重定向的适当状态代码。 我测试了它并且它工作正常,基本上我完全按照你说的做了,在插入到数据库之后我做了一个标题(“位置:...)并且创造了奇迹!谢谢【参考方案5】:

我会使用选项 4:使用一次性表单令牌来验证表单请求。如果请求成功,则使令牌无效。

这样做时,即使在重定向后返回表单也不允许它再次发送表单。此外,这也会使 CSRF 攻击更加困难。

【讨论】:

我可能同意你的选项 4,不幸的是我此时没有使用 SESSION 变量,并且此时添加额外的 SQL 表来存储这些值也是不可取的【参考方案6】:

你需要实现Post/Redirect/Get pattern。

【讨论】:

不幸的是,我对大多数页面都使用了 apache_mod_rewrite,因此不能在结果页面上显示 GET。否则我会打破 mod_rewrite 规则,我猜 那是完全独立于模式的。请注意重定向到正确的 URL。

以上是关于PHP清除浏览器缓存以避免刷新后重新发送表单数据的主要内容,如果未能解决你的问题,请参考以下文章

刷新网页后表单数据尝试重新发送

在浏览器中重新加载/刷新页面而不重新提交表单?

CodeIgniter - 使用重定向重新填充无效表单

重定向到同一页面php后避免表单重新提交[重复]

php避免form表单重复提交

后台修改js或者css文件之后,客户端刷新但是无效的问题