Post Redirect Get - POST永远不会重新提交?

时间:2012-07-07 21:32:53

标签: http http-post http-get

有关Post Post Red Get模式的许多有趣文章,例如:http://www.theserverside.com/news/1365146/Redirect-After-Post

但这是一个简单的问题......

如果用户执行POST并重定向到GET。很好,如果他们点击刷新浏览器只是发送GET,易于理解。但是如果在GET之后点击BACK按钮然后点击刷新他们肯定会再次点击POST?是吗?

我想了解我们如何100%确定永远不会重新提交POST?

2 个答案:

答案 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分钟内提交的所有值的过帐值,丢弃重复项(冒着丢失故意重复的风险)。