Как пользователь автоматически выйдет из всех открытых вкладок, когда пользователь выйдет из одной из них

Я создал страницу входа, среди многих других страниц, которая содержит код для проверки сеанса. Если у пользователя нет сеанса, все страницы будут перезагружать и перенаправлять на страницу выхода. Этот 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);">