第一页包含HTML表单。第二页-处理提交数据的代码。
第一页中的表单已提交。浏览器被重定向到第二页。第二页处理提交的数据。
此时,如果刷新第二页,则会弹出“确认表单重新提交”警报。
可以预防吗?
第一页包含HTML表单。第二页-处理提交数据的代码。
第一页中的表单已提交。浏览器被重定向到第二页。第二页处理提交的数据。
此时,如果刷新第二页,则会弹出“确认表单重新提交”警报。
可以预防吗?
Answers:
人们过去在这里采用两种方法:
方法1:使用AJAX +重定向
这样,您可以使用JQuery或类似于Page2的东西在后台发布表单,而用户仍然看到显示的page1。成功发布后,将浏览器重定向到Page2。
方法2:发布+重定向到自己
这是论坛上的常用技术。Page1上的Form将数据发布到Page2,Page2处理数据并完成需要做的事情,然后对自身进行HTTP重定向。这样,浏览器记住的最后一个“动作”是第2页上的简单GET,因此不会在F5上重新提交表单。
您需要使用PRG-Post / Redirect / Get模式,并且刚刚实现了PRG的P。您需要重定向。(现在,您根本不需要重定向。请参阅此)
PRG是一种Web开发设计模式,可防止某些重复的表单提交,这意味着,提交表单(发布请求1)->重定向->获取(请求2)
Under the hood
重定向状态代码 -HTTP 1.0和HTTP 302或HTTP 1.1和HTTP 303
具有重定向状态代码的HTTP响应还将在位置标头字段中提供URL。带有此代码的响应邀请用户代理(例如Web浏览器)对位置字段中指定的新URL进行其他请求(否则是相同的)。
重定向状态代码是为了确保在这种情况下,Web用户的浏览器可以安全地刷新服务器响应,而无需引起初始HTTP POST请求的重新提交。
Double Submit Problem
Post/Redirect/Get Solution
直接,你做不到,那是一件好事。浏览器的警报在那里是有原因的。该线程应回答您的问题:
建议的两个关键解决方法是PRG模式和AJAX提交,然后进行脚本重定位。
请注意,如果您的方法允许使用GET而不是POST提交方法,那么这既可以解决问题,又可以更好地适应惯例。这些解决方案是在您想要/需要POST数据的假设下提供的。
我真的很喜欢@Angelin的答案。但是,如果您要处理一些不实用的遗留代码,则此技术可能对您有用。
在文件的顶部
// Protect against resubmits
if (empty($_POST)) {
$_POST['last_pos_sub'] = time();
} else {
if (isset($_POST['last_pos_sub'])){
if ($_POST['last_pos_sub'] == $_SESSION['curr_pos_sub']) {
redirect back to the file so POST data is not preserved
}
$_SESSION['curr_pos_sub'] = $_POST['last_pos_sub'];
}
}
然后,在表格末尾,last_pos_sub
按以下步骤操作:
<input type="hidden" name="last_pos_sub" value=<?php echo $_POST['last_pos_sub']; ?>>
尝试尝试:
function prevent_multi_submit($excl = "validator") {
$string = "";
foreach ($_POST as $key => $val) {
// this test is to exclude a single variable, f.e. a captcha value
if ($key != $excl) {
$string .= $key . $val;
}
}
if (isset($_SESSION['last'])) {
if ($_SESSION['last'] === md5($string)) {
return false;
} else {
$_SESSION['last'] = md5($string);
return true;
}
} else {
$_SESSION['last'] = md5($string);
return true;
}
}
如何使用/示例:
if (isset($_POST)) {
if ($_POST['field'] != "") { // place here the form validation and other controls
if (prevent_multi_submit()) { // use the function before you call the database or etc
mysql_query("INSERT INTO table..."); // or send a mail like...
mail($mailto, $sub, $body); // etc
} else {
echo "The form is already processed";
}
} else {
// your error about invalid fields
}
}
字体:https://www.tutdepot.com/prevent-multiple-form-submission/