Есть ли надежный способ выйти из системы, когда браузер закрыт? - PullRequest
9 голосов
/ 14 марта 2011

Я ищу надежный способ выйти из системы или отказаться от сеанса, когда браузер закрыт. Есть ли способ сделать это с браузерами с вкладками ?? Любые предложения приветствуются. Спасибо!

Ответы [ 5 ]

10 голосов
/ 14 марта 2011

Нет надежного способа сделать это немедленно , когда клиент закрывает браузер. Есть событие beforeunload, но даже тогда, когда вы запускаете ajax-запрос во время этого события, не гарантируется, что он когда-либо достигнет сервера. Тем не менее, у вас проблема с несколькими вкладками браузера.

Наиболее надежный способ состоит в том, чтобы иметь относительно короткий тайм-аут сеанса на стороне сервера (например, 1 минуту) и вводить сердцебиение на основе ajax на стороне клиента (например, каждые 30 секунд), чтобы поддерживать сеанс живым.

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

2 голосов
/ 14 марта 2011

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

Очевидно, что это не всегда так ( см. Здесь пример сохранения Firefox информации для входа в систему после выхода из системы), потому что функции «восстановления сеанса» теперь стирают грань между тем, что считается «одиночным» браузерная сессия ". (Лично я думаю, что это должно быть классифицировано как ошибка, но это только мое мнение).

Есть два возможных метода. Первым было бы (как упоминал yojimbo87 до меня) использовать веб-сокеты для поддержания соединения между клиентом и сервером, а когда сокет закрывается, завершить сеанс. Проблема здесь в том, что поддержка веб-сокетов ограничена и, конечно, невозможна ни для чего, кроме самых современных браузеров (FF4, Chrome, IE9 и т. Д.).

Альтернативой может быть использование AJAX для постоянного опроса сервера, чтобы сообщить ему, что страница все еще просматривается, поэтому, если, например, вы отправляете запрос подтверждения активности через AJAX каждые 30 секунд, вы сохраняете отметка времени запроса в сеансе. Если пользователь затем вернется на страницу, а разница во времени между текущим запросом и последним запросом превысит, скажем ... 45 секунд (с учетом задержки), вы будете знать, что пользователь закрыл свой браузер и ему необходимо войти снова.

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

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

1 голос
/ 14 марта 2011

Если вы не используете WebSockets или какой-либо длинный опрос для каждой вкладки, которая отслеживает соединение с клиентом в «реальном времени», вам, вероятно, придется подождать, пока тайм-аут сеанса на стороне сервера.

1 голос
/ 14 марта 2011

Реальным методом будет использование AJAX для частой отправки запросов поддержки на ваши серверы - например, каждую минуту.Затем вы можете отказаться от сеанса, как только подтверждение активности (или несколько в последовательности) не будет получено, как ожидалось.

В противном случае, нет надежного способа достичь этого.Поскольку между браузером и сервером нет постоянной связи, вы не можете обнаружить ситуации, которые не контролируются любым кодом JavaScript, который вы могли запустить в браузере.Например, при сбое в сети вам может потребоваться закрыть сеанс, даже если окно браузера все еще открыто.Следовательно, чтобы сделать систему достаточно надежной, вы должны обнаруживать перебои в сети как «побочный эффект» механизма поддержки активности из браузера (например, как это делает Gmail).

0 голосов
/ 14 марта 2011

Вы можете сделать это через комбинацию Jquery, Ajax и PHP. The Jquery

  function updatestatusOFF(){
        // Assuming we have #shoutbox
        $('#connection').load('connection.php?user=<?php echo $_SESSION['username']; ?>&offline=true');

    }

Сценарий перед выгрузкой

<script>window.onbeforeunload = function() { return updatestatusOFF(); }</script>

и php, который вы должны написать самостоятельно, которыйЯ более чем уверен, что вы можете сделать.это не самый надежный, но это самый простой способ реализовать это.если вы хотите получать отчеты в реальном времени .. посмотрите на комету

...