2015-07-13 3 views
0

У меня возникли проблемы с удалением php-сессии, которую я создал во время входа на веб-сайт, над которым я работаю. Сначала я пытаюсь уничтожить указанную сессию:Сессия PHP полностью не удалена

На странице index.php есть кнопка выхода, которая отображается, если какой-либо код php обнаруживает, что есть сеанс. Он называет это Ajax получить по телефону:

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

Вызов выхода из системы ($ 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 прямо в адресную строку. session_status() возвращает 2, даже после того, как я закрыл Waterfox и снова открылся.

+1

Возможный дубликат [почему сеанс \ _destroy() не работает] (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

Я пробовал все, что мог найти на SO по этой теме, включая это, и никто из них не работал. Всегда были данные, задерживающиеся где-то на сервере для сеанса или, по крайней мере, в соответствии с session_status(). Он никогда не вернет 1, всегда 2 независимо от того, что я сделал, чтобы попытаться уничтожить сеанс и удалить переменные. – Geowil

+0

@ Geowil вы пытались использовать 'unset' для определенных элементов, касающихся вашего логина? например 'unset ($ _ SESSION ['login']);' – Killrawr

Смежные вопросы