PHP会话未完全删除

时间:2015-07-13 02:03:17

标签: php ajax session

我正在遇到一些问题,删除我在登录我正在处理的网站时创建的php会话。首先,我是如何试图破坏上述会议的:

在index.php页面上有一个注销按钮,如果某些php代码检测到有会话,则会显示该按钮。它调用这个Ajax get调用:

        function logout()
        {
            var UName = "<?php echo $_SESSION['Username']; ?>";

            //alert(UName);

            $.ajax(
            {
                url: "php/logout.php",
                type: "get",
                success: function(jsonstr)
                {
                    onSuccess(jsonstr);
                },
                error: function(XMLHttpRequest, textStatus, errorThrown)
                { 
                    alert("Status: " + textStatus);
                    alert("Error: " + errorThrown); 
                }   
            });
        }

这会调用logout.php文件,其中包含以下代码:

<?PHP
header('Content-Type: application/json');
include_once 'login_functions.php';
include_once 'logout_functions.php';

sec_session_start();

$returnedData = logout($_SESSION['Username']);

//echo $returnedData."\n";

if ($returnedData === "true")
{   
    if (isset($_COOKIE[session_name()]))
    {
        setcookie( session_name(), “”, time()-3600, “/” );
    }

    $_SESSION = array();

    session_destroy();
    $_SESSION = NULL;

    $data = array("loggedout" => "true");
    echo json_encode($data);
    exit();
}

else
{
    $data = array("loggedout" => array("false" => $returnedData));
    echo json_encode($data);
}
?>

对logout($ Username)的调用只是调用一个函数来删除与用户会话相关的一些数据库存储值。如果它返回true,则调用会话删除代码,并在返回index.php文件时提醒用户注销它们。

以防它是相关的,这是我用sec_start_session()创建会话的方式:

function sec_session_start()
{
    $session_name = 'sec_session_id';
    $secure = secure;
    $httponly = true; //Keep Javascript from obtaining any cookie information

    //echo "Function: start_sec_session \n"; //For debugging

    //Force use of cookies
    if (ini_set('session.use_only_cookies', 1) === FALSE)
    {
    }

    $cookieParams = session_get_cookie_params();//Set session cookie paramaters

    session_set_cookie_params($cookieParams["lifetime"], $cookieParams["path"], $cookieParams["domain"],$secure,$httponly); //Set the parameters

    session_name($session_name); //Change the session name

    session_start(); //Start the session

    session_regenerate_id(); //Recreates the session, deletes the old one, and generates a new encryption key
}

现在,这是问题所在。每当我从管理页面调用以下代码片段时,session_status()函数总是返回值2,session_active。

<?php else :?>
        <div class="row">
            <div class="col-xs-12">
                <div class="panel panel-default">
                    <div class="panel-heading">
                            Protected Page! <?php echo session_status(); ?> 
                    </div>

我还有另一种方法可以检测用户是否有会话,因为我在我的数据库中存储了一些时间戳以处理超时但这个问题可能会导致某些问题在路上而且我想最小化我必须打电话到数据库。

我已经阅读了会话被销毁后重新加载页面的所有地方,并且删除的cookie应该腾出会话值,但这似乎不会发生在这里。实际上有两个页面重新加载。第一个是在用户被提醒注销后立即:

else if (rD[0] === "loggedout")
{
    if (rD[1] === "true")
    {
        alert("You have now been logged out.  The page will now reload.  Please come again!");

        window.location.reload();
    }

    else
    {   
        document.getElementById("errpanel").style.visibility = "visible";
        document.getElementById("errmsg").textContent = rD[2];
    }
}

第二次重新加载,如果可以称为重新加载,则在我进入管理页面时发生,因为当列为管理员的某人未登录时,我没有直接链接(链接未显示在反正是index.php页面并且到达那里我只是直接在地址栏中输入url。在关闭了Waterfox并重新打开后,session_status()返回2。

3 个答案:

答案 0 :(得分:0)

使用 session_destroy()后,会话cookie被销毁并被删除。并且会话不再存储在服务器上。 $ _ SESSION 中的值可能仍然可用,但它们不会在下一页加载时显示。

Have a look here进行更多讨论。

答案 1 :(得分:0)

在我的头撞墙一天半之后,我决定从头开始重新制作我的会话管理系统,因为它的实施方式导致我无法解决的问题。

答案 2 :(得分:0)

您应该使用unset$_SESSION删除值。

if(isset($_SESSION)) {
    unset($_SESSION);
    session_destroy();
}