Как пользователь автоматически выйдет из всех открытых вкладок, когда пользователь выйдет из одной из них
Я создал страницу входа, среди многих других страниц, которая содержит код для проверки сеанса. Если у пользователя нет сеанса, все страницы будут перезагружать и перенаправлять на страницу выхода. Этот script вызывается каждые три секунды.
Код, который я написал, работает нормально, но я хочу реализовать его другим способом. Когда пользователь выходит из системы, все открытые вкладки перезагружают/обновляют, заставляя пользователя выходить из системы. Возможно ли это?
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>
Ответы
Ответ 1
Когда ajax полезен
Выполнение запроса ajax на ваш сервер каждые 3 секунды полезно на всякий случай
1. Вы открыли вкладки в разных браузерах
2. или на многих компьютерах.
3. или вы используете очень старые браузеры.
Настройка cookie не работает.
Подход с использованием файла настроек cookie не работает, поскольку одна вкладка не знает об изменениях файлов cookie на другой вкладке. Это из-за document
(где файлы cookie получены с помощью getCookie) вкладки A не изменяется без запроса на сервер. Вы можете открыть две вкладки SO и попытаться установить setCookie('name', 'val', 1)
на одну вкладку и посмотреть на document.cookie
на другой вкладке.
Как сделать еще одну вкладку о немедленном выходе из системы
Если вам нужно выйти из всех вкладок одного и того же браузера, было бы замечательно передавать сигналы между вкладками. Есть несколько способов, я хочу рассказать вам об использовании localStorage
(здесь).
Вы можете подключить прослушиватель к событию storage
(активирован при изменении элемента хранилища) и отправить сигнал logout-event
.
localStorage.setItem('logout-event', 'logout' + Math.random());
Каждая другая вкладка получит ее со слушателем.
window.addEventListener('storage', function(event){
if (event.key == 'logout-event') {
// ..
}
});
Что делать, если старые браузеры без localStorage
Вы можете использовать оба подхода - localStorage
и автоматически обновлять, например каждые 60 секунд, чтобы убедиться, что он работает, когда вкладки открываются на разных компьютерах. Если localStorage
не работает (очень старые браузеры), автоматически обновляйте каждые 3 секунды.
следующая скрипта показывает, как с этим бороться.
Что еще?
Вы можете использовать node.js + socket.io для отправки сигналов между всеми браузерами Пользователь. Он работает быстро и выйдет из системы на каждом устройстве, но с ним немного сложнее, чем с обычным jQuery.
Ответ 2
позволяет подумать о том, что вы используете 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;
Примечание: вы должны установить $inactive = 6000;
(например) как глобальную переменную, а login
Ответ 3
Для этого у вас есть два варианта.
Либо сохраняйте значения сеанса на сервере и часто делайте запросы Ajax на сервер, чтобы проверить, все ли пользователи вошли в систему или нет.
Но это сделает огромную нагрузку на сервер, а также потребляет пропускную способность сети пользователя.
Или еще,
проверить, что зарегистрированный файл cookie по-прежнему существует или не используется в браузере.
Это будет хороший подход.
Оба могут выполняться с помощью setTimeout
или setInterval
Но второй должен быть хорошим.
Ответ 4
Вот что вам нужно. В этом,
фрагмент показывает некоторую ошибку, я не знаю почему.
Итак, скопируйте код 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);">