Я создал страницу входа, среди многих других страниц, которая содержит код для проверки сеанса. Если у пользователя нет сеанса, все страницы будут перезагружать и перенаправлять на страницу выхода. Этот скрипт вызывается каждые три секунды.
Код, который я написал, работает нормально, но я хочу реализовать его по-другому. Когда пользователь выходит из системы, все открытые вкладки перезагружают / обновляют, заставляя пользователя выходить из системы. Это возможно?
sessioncheck.php :
<?php session_start(); if(isset($_SESSION['username']) && $_SESSION['username'] != ''){ echo "true"; } else { echo "false"; } ?>
Этот код находится в нижнем колонтитуле страницы:
<script> function gettatus(){ $.get("sessioncheck.php", function(data){ if(!data) { window.location = "logout.php"; } setTimeout(function(){ checkLoginStatus(); }, 3000); }); } $(document).ready(function(){ gettatus(); }); </script>
Когда ajax полезен
Выполнение запроса ajax на ваш сервер каждые 3 секунды полезно только в случае 1. вы открыли вкладки в разных браузерах 2. или на многих компьютерах. 3. или вы используете очень старые браузеры
Настройка cookie не работает.
Подход с использованием файла настроек cookie не работает, поскольку одна вкладка не знает об изменениях файлов cookie на другой вкладке. Это из-за document
(где куки-файлы получены с помощью getCookie) вкладки A не меняются без запроса на сервер. Вы можете открыть две вкладки SO и попытаться установить setCookie('name', 'val', 1)
на одной вкладке и посмотреть на document.cookie
на другой вкладке.
Как сделать еще одну вкладку сразу узнали о выходе из системы
Если вам нужно выйти из всех вкладок одного и того же браузера, было бы замечательно передавать сигналы между вкладками. Есть несколько способов, я хочу рассказать вам об использовании localStorage
( здесь здесь ).
Вы можете подключить прослушиватель к событию storage
(активирован при изменении элемента хранилища) и отправить сигнал logout-event
из logout-event
.
localStorage.setItem('logout-event', 'logout' + Math.random());
Каждая другая вкладка получит его с прослушивателем.
window.addEventListener('storage', function(event){ if (event.key == 'logout-event') { // .. } });
Что делать, если старые браузеры без localStorage
Вы можете использовать оба подхода – localStorage
и auto-refresh, например каждые 60 секунд, чтобы убедиться, что он работает, когда вкладки открываются на разных компьютерах. Если localStorage
не работает (очень старые браузеры), автоматически обновляйте каждые 3 секунды.
Следующая скрипка показывает, как с этим справиться.
Что еще?
Вы можете использовать node.js + socket.io для отправки сигналов между всеми браузерами пользователя. Он работает быстро и выйдет из системы на каждом устройстве, но с ним немного сложнее, чем с обычным jQuery.
рассмотрим что-то, что вы используете php-сессию, и вы проверяете следующий код каждый раз, когда вы загружаете свои страницы или через некоторое время
<?php session_start(); if(isset($_SESSION['username']) && $_SESSION['username'] != '') echo true; else echo false; ?>
Итак, в файле logout.php вы, вероятно, делаете что-то вроде этого unset ($ _ SESSION ['username']); и session_destroy ();
Поэтому, когда ваша страница вызовет эту проверку php, вы найдете false взамен и что следующий пользователь больше не получит доступ из любого браузера и любых страниц. И для автоматического выхода из системы попробуйте это
$sessionTTL = time() - $_SESSION["timeout"]; if ($sessionTTL > $inactive) { session_destroy(); unset($_SESSION['username']); echo false;
с$sessionTTL = time() - $_SESSION["timeout"]; if ($sessionTTL > $inactive) { session_destroy(); unset($_SESSION['username']); echo false;
Примечание: вы должны установить
$inactive = 6000;
(например) в качестве глобальной переменной при входе в систему
Для этого у вас есть два варианта. Либо сохраняйте значения сеанса на сервере и часто делайте запросы Ajax на сервер, чтобы проверить, все ли пользователи вошли в систему или нет. Но это сделает огромную нагрузку на сервер, а также потребляет пропускную способность сети пользователя. Или,
проверьте, что зарегистрированный файл cookie все еще существует или не используется в браузере. Это будет хороший подход .
Оба могут выполняться setTimeout
или setInterval
Но второй должен быть хорошим.
Вот что вам нужно. В этом фрагменте показана некоторая ошибка, о которой я не знаю. Итак, скопируйте код javascript в консоль браузера (f12) и проверьте его. Он работает. Когда вы входите в систему, вы должны использовать
setCookie('loggedin','true',1);
Здесь мы устанавливаем файл cookie,
function setCookie(cookiename, cookievalue, expdays) { var d = new Date(); d.setTime(d.getTime()+(expdays * 24 * 60 * 60 * 1000)); var expires = "expires=" + d.toUTCString(); document.cookie = cookiename + "=" + cookievalue + "; " + expires; } function getCookie(cookiename) { var name = cookiename + "="; var startPos = document.cookie.indexOf(name); if(startPos == -1) return null; startPos+=(name.length); if(document.cookie.indexOf(";",startPos) == -1){ return document.cookie.substring(startPos,document.cookie.length); } else{ return document.cookie.substring(startPos,document.cookie.indexOf(';',startPos)); } return null; } function checkCookie() { var loggedin = getCookie("loggedin"); if (loggedin && loggedin !=null) { // Logged in //do nothing } else{ window.location.href="login.php"; } }
<!-- use the below code in logged in home page to check whether the user is logged in still or not in a time interval of 1 second. Change 1000 as per your need.//--> <body onload = "setTimeout(checkCookie,1000);">