我完全失去了言辞。
如果在此过程中出现错误,我允许管理员重置其注册。理论上,以下代码应该像这样运行:
到达页面,根据会话数据设置$ adminvalidated。 $ _SESSION数组被清除; cookie在消费者端被清除;会话ID被重新审核并且会话被销毁。然后重新启动会话,并将前面提到的变量放回Session。
下面包含的“echo”语句可以正常工作,但是当我重定向到另一个页面时(下面已注释掉),会话变量不会继续使用。
是的,我也在后续页面上开始了会议。
<?php
session_start();
ob_start();
if( $_SERVER['SERVER_PORT'] == 80) {
header('Location:https://'.$_SERVER['HTTP_HOST'].$_SERVER["REQUEST_URI"]);
die();
}
$adminvalidated = $_SESSION['ADMINVALIDATED'];
$_SESSION = array();
if (ini_get("session.use_cookies")) {
$params = session_get_cookie_params();
setcookie(session_name(), '', time() - 42000,
$params["path"], $params["domain"],
$params["secure"], $params["httponly"]
);
}
session_regenerate_id(true);
session_destroy();
session_start();
$_SESSION['ADMINVALIDATED'] = $adminvalidated;
echo $_SESSION['ADMINVALIDATED'];
/*
header("Location: ../a.php");
exit;*/
?>
答案 0 :(得分:1)
From the manual page of session_start
:
从PHP 4.3.3开始,在先前启动会话之后调用session_start()将导致级别E_NOTICE的错误。此外,第二个会话开始将被忽略。
只需使用session_unset
清除会话,重新生成会话ID,然后重置您的admin var。无需销毁然后重新启动会话。
答案 1 :(得分:1)
通常,只需调用session_regenerate_id(true)
来更改当前会话的会话ID ,就会使与先前会话ID的关联无效。
如果您还想清除$_SESSION['ADMINVALIDATED']
以外的任何会话数据,请执行以下操作:
session_regenerate_id(true);
$_SESSION = array(
'ADMINVALIDATED' => $_SESSION['ADMINVALIDATED']
);
答案 2 :(得分:0)
我真的不确定你为什么要经历所有这些步骤。 session_regenerate_id()足以重新生成会话令牌和关联的cookie。该函数创建一个新的会话令牌,并为您创建一个新的会话cookie,同时保留当前会话中的值。由于设置一个具有相同名称的新cookie会覆盖旧的cookie不仅仅是调用session_regenerate_id()吗?
如果我错过了什么,请随意澄清事情。