有关Post Post Red Get模式的许多有趣文章,例如:http://www.theserverside.com/news/1365146/Redirect-After-Post
但这是一个简单的问题......
如果用户执行POST并重定向到GET。很好,如果他们点击刷新浏览器只是发送GET,易于理解。但是如果在GET之后点击BACK按钮然后点击刷新他们肯定会再次点击POST?是吗?
我想了解我们如何100%确定永远不会重新提交POST?
答案 0 :(得分:1)
确保不重新提交POST的一种方法是具有与该帖子会话相关联的唯一标识符,例如,如果它是购物车,则当它们开始签出时,为该过程生成唯一ID。结帐完成后(例如已发送POST),从可以使用的ID中删除该ID。
您也可以通过使用表单生成唯一键来完成此操作,如果表单已提交,请从存储位置删除该键。
<input type="hidden" name="key" value="<?php echo generateUniqueKey(); ?>" />
其中generateUniqueKey()函数将查询表并插入唯一ID,然后返回ID。在您处理表单的页面上,执行以下操作:
<?php
$key = $_POST['key'];
if (isKeyStillValid ($key)) {
markKeyAsInvalid ($key);
// Process form ...
}
else {
die ("You have already submitted this form".);
}
?>
其中isKeyStillValid()函数将检查数据库以确保与表单一起使用的密钥仍然是可用密钥,而markKeyAsInvalid()函数将从数据库中删除密钥。
<强>更新强> 这是我刚刚制作的一个例子,它涉及我之前描述的内容。这是一个非常简单的示例,只是在SQL表中使用自动递增ID作为键,但它应该足以作为示例。实际上,你会想要比这更深思熟虑的东西。 http://alexloney.com/post/
答案 1 :(得分:0)
但是如果在GET之后点击BACK按钮然后点击刷新他们肯定会再次点击POST?是吗?
呀。
当用户使用后退按钮时,可能会发生这种情况 - 该模式无法防止这种情况发生,只是反对将结果显示在与原始表单相同的相同页面中,其中刷新(F5)会导致重新发布。
我们如何100%确定永远不会重新提交POST?
一种方法是检查过去X分钟内提交的所有值的过帐值,丢弃重复项(冒着丢失故意重复的风险)。