我有一个3页系统,表单>发布>提交到位。我遇到的问题是,如果用户从提交的页面按下后退按钮,它会将它们带到表单页面,并填入值,因此如果他们单击“提交”,则会重新输入数据。
在通常情况下,用户会正常返回索引页面,并且我们会检查用户ip在过去一小时内出现在所述数据库(mysql)中的次数,并限制发布后的能力在那。但如果他们回过头来,那个系统就无效了。
我唯一能够防止这种情况的代码是:
ob_start();
header('Cache-Control: private');
但这似乎什么都不做。
非常感谢任何帮助!
答案 0 :(得分:0)
在提交数据之前立即进行POST检查,或者将其重定向(更改标题位置)到另一个包含所需信息的成功/已提交页面。这样,如果他们点击回来,他们会返回原来的提交页面,将他们重定向回成功/提交页面。
还有其他解决方案,但这一切都取决于目的 - 这是为了防止标准用户犯愚蠢的错误或恶意用户。
答案 1 :(得分:0)
你可以尝试:
header('Cache-Control: no-cache');
我无法看到启用输出缓冲如何阻止此行为,因此您可能希望省略ob_start()和ob_flush()调用。
但我同意这样做会更好:
header("Location: mypage.php?somepublicdata=this+is+public");
然后使用$ _SESSION来继承$ _POST数据。
答案 2 :(得分:0)
不应该这样的工作吗? (我自己没试过。)
<head>
<script>
function clearForms()
{
var i;
for (i = 0; (i < document.forms.length); i++) {
document.forms[i].reset();
}
}
</script>
</head>
<body onLoad="clearForms()" onUnload="clearForms()">
</body>
答案 3 :(得分:0)
我有一个快速的解决方案:
<?php
//Check for double post
//Start session
session_start();
$process = true;
if(isset($_POST)){
if(isset($_SESSION['olddata'])){
if($_SESSION['olddata'] == $_POST){
$process = false;
}
$_SESSION['olddata'] == $_POST;
}
}
//Now you can check $process before you do something with the data
&GT;