这是一个简单的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存储在PHPSESSID cookie中。会话ID重新生成后,我关闭浏览器并打开它。浏览器关闭后,cookie值会发生变化。 chrome中没有这样的问题。
如果您打开此页面,您会看到PHPSESSID cookie带有一些值(值#1) 如果单击提交按钮,PHPSESSID cookie将被更改(值#2)
然后,如果您关闭firefox 35.0.1并重新打开它,您将看到PHPSESSID cookie的值为#1。为什么会这样?这是firefox的bug吗? 如果在重新打开后在chrome中执行相同的操作,您将看到值#2
这对我来说非常重要,因为在我的网站中,我会在用户进行身份验证时执行相同的操作。浏览器重新打开后,用户将被注销。
答案 0 :(得分:0)
重新加载浏览器页面时,它还会重新提交$_POST
,$_REQUEST
和$_GET
数组中的数据。 Firefox可能会重复此过程,而Chrome可能会注意到该过程已经发生过一次,而不是重新提交数据。
当您刷新表单填充页面时,Firefox通常会提出“您确定要重新提交此数据”显示,它只是不同浏览器的不同数据。要确保只有两条路线(可能更多)才会提交表单:
1)表单和会话工作在服务器页面上进行,该服务器页面不输出到浏览器而是转发到“已完成”的浏览器页面。然后刷新只需重新加载完成的页面
2)添加某种形式的标志,数据库或(其他)cookie控制,检查是否已使用cookie中的标记系统提交$_POST
数据。