2

当用户单击注销按钮时,我连接到一个简单地执行此操作的脚本

session_destroy();
session_start();

我认为这足以重置所有$_SESSION变量$_SESSION['logged']$_SESSION['username']但是当我再次加载页面时,它会自动让我登录,就好像会话仍然处于活动状态一样。

4

3 回答 3

9

正如文档所解释的:

它不会取消设置与会话关联的任何全局变量,也不会取消设置会话 cookie。要再次使用会话变量,必须调用 session_start()。

为了完全终止会话,例如注销用户,还必须取消设置会话 ID。如果使用 cookie 传播会话 id(默认行为),则必须删除会话 cookie。setcookie() 可以用于此。

它还提供了如何执行此操作的示例:

<?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();
?>

只需清除数组即可将用户注销;它们仍将具有相同的会话 ID,但$_SESSION将为空,因此$_SESSION['logged']不会$_SESSION['username']存在

于 2010-05-29T22:58:24.707 回答
1

当然你只会有 $SESSION_DESTROY(); 独立,没有 $SESSION_START(); 在注销页面内?

于 2010-05-29T22:57:55.577 回答
0

您必须使用 Page_init() 事件来检查用户会话变量。如果您在页面加载时检查用户会话变量,那么它会将您显示为活动会话。只有一种方法可以在 Page_init() 事件中检查用户会话,如下所示。

    protected void Page_init(object sender, EventArgs e)
    {
        if (Session["User"] == null)
        {
            Response.Redirect("home.aspx");
        }
    }

您可以在所有页面上使用此事件,因此如果您使用 session_destroy() 销毁会话;方法,然后您将被重定向到登录页面。

谢谢你

于 2012-04-26T14:12:55.570 回答