2015-07-13 99 views
0

我遇到了一些问题,删除一个php会话,我登录时在我正在工作的网站上创建。首先这里是我如何试图破坏所述会话:PHP会话没有完全删除

在index.php页面上有一个注销按钮,如果某些php代码检测到存在会话,则会显示该按钮。在调用此阿贾克斯获得致电:

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

注销($用户名)的调用只是调用该删除功能一些与用户会话相关的数据库存储值。如果它返回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页面上)并且到达那里时,我只是直接在地址栏中输入网址。 session_status()在我关闭Waterfox并重新打开后返回2。

+1

[why session \ _destroy()not working](http:// stackoverflow。com/questions/6472123/why-session-destroy-not-working) –

回答

0

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

Have a look here有关更多讨论。

+0

我在原始文章中引用的管理页面无法直接转到地址栏中获取。这是否构成页面重新加载?如果是这样,那么由于某种原因会话值仍然存在。在通知用户他们已经登录到索引页面后,我也直接重新加载页面。 – Geowil

0

在将我的头撞向墙壁一天半之后,我决定从头开始重新构建会话管理系统,因为它如何实现会导致我无法解决的问题。

0

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

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

我尝试了一切,我可以找到关于这个主题,包括这个,并没有工作。总会有数据在服务器上的某个地方留下,或者至少根据session_status()。无论我如何尝试销毁会话并删除变量,它永远不会返回1,总是2。 – Geowil

+0

@Geowil你有没有尝试对你的登录的特定元素使用'unset'?像'unset($ _ SESSION ['login']);' – Killrawr