Я не хочу, чтобы сессия была недействительной, пока браузер не закрыт - PullRequest
0 голосов
/ 31 июля 2010

Сохранение идентификатора сеанса на клиентском компьютере не является проблемой и очень просто. Проблема заключается в том, чтобы сохранить фактический сеанс на сервере, пока я не почувствую, что с ним покончено.

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

Является ли единственное решение для регулярных HTTP-запросов с использованием javascript, чтобы предотвратить сборку GC сессии, если клиент бездействует?

Заранее спасибо

Ответы [ 4 ]

3 голосов
/ 31 июля 2010

В значительной степени да. Вы не можете достоверно определить, что окно браузера было закрыто. Даже если JS предлагает событие закрытия вдовы, его не следует использовать, поскольку закрытие браузера нажатием кнопки «закрыть» - это только один из нескольких способов завершения сеанса клиента.

Другие возможности:

  1. Сбой браузера
  2. сбой компьютера клиента
  3. Сетевое соединение умирает
  4. Некоторые браузеры не рассматривают закрытие окна как событие выгрузки (Opera даже не рассматривает закрытие вкладки или удаление с веб-страницы путем ввода адреса в адресной строке как событие выгрузки)
1 голос
/ 31 июля 2010

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

Однако у вас нет реального способа узнать, когда пользователи закрывают свой браузер.Самое простое, что можно сделать - это настроить пингер JavaScript или META REFRESH, который будет информировать вас, пока у вас открыта ваша страница - но вы не можете знать, что браузер по-прежнему не открыт для другой страницы.

0 голосов
/ 25 августа 2010

Есть много способов, которые ни один из них не желателен. Я перечислю то, что я изучаю. Примечание: я надеюсь, что люди это понимают. Большинство людей предполагают, что я хочу выйти из системы только тогда, когда клиент закрывает браузер. Дело не в этом, я просто хочу высвободить ресурсы вместо 20-минутного лага. Думаю, большинство разработчиков просто обновляют компьютер.

1) Продолжайте пинговать свой сервер из клиентского скрипта, таким образом, он будет поддерживать «короткий сеанс» в живых. Это, очевидно, увеличит трафик на ваш сервер, и, очевидно, он не выйдет из системы мгновенно, так как вы не хотите пинговать каждую секунду.

2) Используйте Javascript от клиента broswer. Пока что я не думаю, что какой-либо из них работает, даже в существующем примере кода IE, clienX будет> 0. В любом случае, вот код, который работает для меня до сих пор. Только на IE, так как событие Firefox не работает для меня прямо сейчас. Я приблизительно рассчитал положение кнопки закрытия относительно экрана и определил, нажал ли клиент в этой области. Если кнопка обновления слишком близка к кнопке закрытия (по оси x), она будет думать, что вы нажали кнопку закрытия, но это редкий случай.

<head runat="server">
    <title>Untitled Page</title>
<script type="text/javascript">
    function test(event) {
        var X = window.event ? window.event.screenX : event.clientX;

        // IE only because event.clientX for FF = undefined (event.clientX IS the FF way).
        if (X == null) {
            alert("No X");
            return;
        }

        var left = window.screenLeft ? window.screenLeft : window.screenX;
        var winwidth = document.body.clientWidth ? document.body.clientWidth : window.outerWidth;
        var leftMargin = document.body.leftMargin ? parseInt(document.body.leftMargin, 10) : 0;
        var rightMargin = document.body.rightMargin ? parseInt(document.body.rightMargin, 10) : 0;
        var resultX = X - (window.screenLeft + winwidth + leftMargin + rightMargin); // scroll bar width is not calculated.
        var Y = window.event ? window.event.clientY : event.clientY;

        if (resultX > -25 && Y < 0)
            alert("logging out");
    };
</script>

</head>
<body onbeforeunload="test(event);">
0 голосов
/ 31 июля 2010

Я полагаю, что вы можете использовать XMLHTTPRequest (технология Ajax), чтобы пропинговать ваш сервер, скажем, на пустой странице с помощью метода session_start ();Скажем, каждые пятнадцать минут (время ожидания сеанса PHP по умолчанию равно 20 секундам), чтобы они не перегружали ваш сервер.

Но, если вы действительно хотите иметь постоянные данные, то используются файлы cookie без явного истекшего времени.очищено при выходе из браузера, поэтому вы можете хранить ключ хранения в cookie.Это имеет одно преимущество перед сеансом - если сетевое соединение клиента прекращается, сеанс все еще работает.Но это может привести к большему риску перехвата сеанса.

Если вы говорите о том, чтобы вход в систему сохранялся в сеансе браузера, предпочтительнее использовать файлы cookie, и он используется многими сайтами по всему миру, включая Drupal, Wordpress иJoomla!CMS.

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