我创建了一个用户页面,其中包含一个包含注销按钮的菜单。单击该按钮后,将使用以下代码将用户定向到注销页面:
session_start();
session_destroy();
include("/var/www/include/header.inc");
echo "<h>Logout Success</h>";
include("/var/www/include/menu.inc");
include("/var/www/include/footer.inc");
menu.inc 文件中的代码编写为:
if(@$_SESSION['login'] == "yes")
{
// show expanded menu
}
else
{
// show normal menu
}
退出后我现在看到的是扩展菜单。看起来菜单被包含得比会话被破坏的速度快,从而产生了用户仍然登录的印象。有没有办法避免这种情况?
答案 0 :(得分:1)
session_destroy()
销毁与当前会话相关的所有数据。 它不会取消设置与会话相关的任何全局变量,也不会取消设置会话Cookie。
答案 1 :(得分:1)
session_destroy没有取消设置$ _SESSION数组,因此session_destroy之后的页面的其余部分仍会看到它。你可以试试这个
session_destroy();
unset($_SESSION);
答案 2 :(得分:0)
要完全清除所有会话数据,您必须使用与
类似的内容<?php
// Initialize the session.
// If you are using session_name("something"), don't forget it now!
session_start();
// Unset all of the session variables.
$_SESSION = array();
// If it's desired to kill the session, also delete the session cookie.
// Note: This will destroy the session, and not just the session data!
if (ini_get("session.use_cookies")) {
$params = session_get_cookie_params();
setcookie(session_name(), '', time() - 42000,
$params["path"], $params["domain"],
$params["secure"], $params["httponly"]
);
}
// Finally, destroy the session.
session_destroy();
?>
这在PHP手册中有解释:
session_destroy()会销毁与当前关联的所有数据 会话。它不会取消任何与之相关的全局变量 会话,或取消设置会话cookie。要使用会话变量 再一次,必须调用session_start()。
为了完全杀死会话,喜欢将用户注销掉, 会话ID也必须取消设置。如果使用cookie来传播 会话ID(默认行为),然后会话cookie必须是 删除。 setcookie()可以用于此。