为什么在浏览器重新打开后这个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
数据。