У меня возникли проблемы с удалением 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 и снова открылся.
Возможный дубликат [почему сеанс \ _destroy() не работает] (http: // stackoverflow.com/questions/6472123/why-session-destroy-not-working) –