1

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

但这里有一个简单的问题......

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

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

4

2 回答 2

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 作为 key,但作为一个例子应该足够了。实际上,你会想要比这更深思熟虑的东西。 http://alexloney.com/post/

于 2012-07-07T21:42:35.757 回答
0

但是,如果在 GET 之后点击 BACK 按钮然后点击刷新,他们肯定可以再次点击 POST 吗?是的?

是的。

当用户使用后退按钮时,可能会发生这种情况 - 该模式不能防止这种情况发生,只是防止结果出现在与原始表单相同的页面中,其中刷新 (F5) 会导致重新发布。

我们如何能 100% 确定 POST 永远不会被重新提交?

一种方法是根据最后 X 分钟内提交的所有值检查发布的值,丢弃重复项(有丢失故意重复项的风险)。

于 2012-07-07T21:36:02.180 回答