为什么此cookie在浏览器重新打开后更改值


Why this cookie changes value after browser reopening?

这里有一个简单的php代码,它启动会话并重新生成会话id,并在POST请求时设置cookie生存期。

<?php
// url: http://localhost/sessiontest/
session_start();
if (isset($_POST['test'])) {
    ini_set('session.cookie_lifetime', 86400);
    session_regenerate_id(true);
    header('Location: http://localhost/sessiontest/');
    return;
}
print_r($_COOKIE);
?>
<html>
    <form method="post" action="">
        <input type="text" name="test" />
        <input type="submit" />
    </form>
</html>

我在firefox 35.0.1中遇到问题。会话id存储在PHPSSID cookie中。会话id重新生成后,我关闭浏览器并打开它。浏览器关闭后,cookie值发生了更改。铬不存在这样的问题。

如果你打开这个页面,你会看到PHPSESSID cookie有一些值(值#1)如果您点击提交按钮PHPSESSID cookie将被更改(值#2)

然后,如果您关闭firefox 35.0.1并重新打开它,您将看到PHPSESSID cookie的值为#1。为什么会发生这种情况?是萤火虫的虫子吗?如果你在重新打开后在chrome中也这样做,你会看到值#2

这对我来说非常重要,因为在我的网站上,当用户进行身份验证时,我也会这样做。浏览器重新打开后,用户将注销。

重新加载浏览器页面时,还会重新提交$_POST$_REQUEST$_GET数组中的数据。Firefox可能会重复这个过程,而Chrome可能会注意到这个过程已经发生过一次,并且不会重新提交数据。

当你刷新表单填充的页面时,Firefox经常会显示"你确定要重新提交这些数据吗",这只是不同浏览器的不同数据。为了确保只有在有两条路线(可能更多)时才会提交表格:

1) 表单和会话工作发生在服务器页面上,该页面不会输出到浏览器,而是转发到"已完成"的浏览器页面。然后刷新只需重新加载已完成的页面

2) 添加某种形式的标志、数据库或(其他)cookie控制,以检查是否已经使用cookie中的标志系统提交了$_POST数据。