Session Destroy, когда закрывается одна вкладка браузера - PullRequest
0 голосов
/ 12 декабря 2018

BackGround Я создал веб-приложение, в котором пользователю необходимо войти в систему, чтобы использовать функции веб-приложения.


Я бы хотел сделать его достаточно безопасным на стороне сеанса (чтобы не оставлять сеанс открытым).Я знаю, что сессия по умолчанию уничтожается при закрытии браузера (вы закрываете все вкладки Chrome).Я также добавил этот код PHP на кнопку выхода из системы, чтобы уничтожить его.

<?php
session_start();
unset($_SESSION['username']);
unset($_SESSION['password']);
session_destroy();
header('location: somelocation');
?>

Моя проблема в том, что когда пользователь закрывает только вкладку браузера, в которой находится приложение, сеанс не будет уничтожен, и он будетвозможность открыть его, не выполняя вход снова.Поэтому, если у пользователя открыта вкладка YouTube (например), и он закрывает только вкладку, на которой находится мое приложение, сеанс не будет уничтожен.Есть способ обнаружить это и уничтожить сессию?Я уже взглянул на: выход пользователя из системы, когда браузер или вкладка закрыты и уничтожение сеанса при закрытии вкладки браузера Но они не отвечают на мой вопрос.Спасибо за совет.

Ответы [ 3 ]

0 голосов
/ 12 декабря 2018

Я бы посоветовал вам сделать AJAX-вызов функции PHP, которая уничтожит сеанс.Код, который вы написали в своем вопросе, будет работать.Но есть хитрость для инициирования вызова AJAX.

Когда пользователь закрывает вкладку браузера, запускается ajax и сеанс будет уничтожен.Здесь я показал, как:

var flag_var = false;
function pageCleanup()
{
    if (!flag_var)
    {
        $.ajax({
            type: 'GET',
            async: false,
            url: 'SomeUrl.com/php_file.php',
            success: function ()
            {
                flag_var = true;
            }
        });
    }
}


$(window).on('beforeunload unload', function ()
{
    //this will work only for Chrome
    pageCleanup();
});
0 голосов
/ 12 декабря 2018

Из-за особенностей модели клиент / сервер нет простого способа сделать то, что вы хотите.Если пользователь может некоторое время бездействовать после загрузки вашей страницы, он также может закрыть вкладку и открыть ее снова.Вы не можете контролировать действия клиентов на стороне клиента.Для этого есть простые методы javascript, такие как событие unload , но они ненадежны и часто не работают.

Вы можете использовать websockets , чтобыклиент всегда подключен или выполняет несколько запросов AJAX в фоновом режиме и сохраняет тайм-аут в течение нескольких секунд в сеансе, но эти методы отключают пользователя, если его интернет-соединение прерывается даже на несколько мгновений.

0 голосов
/ 12 декабря 2018

Есть нюанс, который мы обнаружили с тайм-аутом сеанса, хотя пользователь все еще активен в сеансе.Проблема связана с тем, чтобы никогда не изменять переменную сеанса.

ГХ очистит файлы данных сеанса на основе времени их последнего изменения.Таким образом, если вы никогда не изменяете сеанс, вы просто читаете из него, то GC в конечном итоге очистится.

Чтобы предотвратить это, вам нужно убедиться, что ваш сеанс изменен в течение времени удаления GC.Вы можете сделать это, как показано ниже.

<?php 
if( !isset($_SESSION['last_access']) || (time() - $_SESSION['last_access']) > 60 ) 
  $_SESSION['last_access'] = time(); 
?> 

Это будет обновлять сеанс каждые 60 секунд, чтобы гарантировать изменение даты изменения.

Ссылка Сеанс PHP

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...