为什么在浏览器重新打开后这个cookie会改变数值?

问题描述:

这是一个简单的php代码,它启动会话并重新生成会话ID并在POST请求中设置cookie生存期。为什么在浏览器重新打开后这个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存储在PHPSESSID Cookie中。会话ID重新生成后,我关闭浏览器并打开它。浏览器关闭后,Cookie值会更改。 Chrome中没有这样的问题。

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

然后,如果你关闭Firefox 35.0.1并重新打开它,您将看到PHPSESSID cookie的值为#1。为什么会发生?这是一个Firefox的错误? 如果您在重新打开之后在Chrome中执行相同的操作,您将看到#2的价值

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

当浏览器页面重新加载时,它也会重新提交$_POST,$_REQUEST$_GET阵列中的数据。 Firefox可能会重复这一过程,而Chrome可能会注意到该过程发生过一次,而不是重新提交数据。

当你刷新一个表单填充页面时,Firefox会经常想出一个“你确定要重新提交这个数据”显示,它只是不同的浏览器不同的数据。要确保表单提交只发生一次有两条路线(可能更多):

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

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