У меня есть система входа в php с функциями выхода и т. Д. Но мне нужно, чтобы сессия была уничтожена при закрытии окна. Это должно быть «мгновенно» или как можно быстрее, чтобы изменить статус пользователя в автономном режиме. Я действительно не хочу устанавливать время на сеансе, так как это раздражает, когда пользователь должен войти в систему все время.
Любые предложения приветствуются, спасибо. знак равно
По умолчанию все сеансовые куки, отправленные PHP, удаляются при закрытии браузера. Но, насколько я вижу, вы хотите показывать уведомления в других браузерах. Это немного сложнее и не совсем приятно. Вам нужно будет использовать обработчик события window.onclose и выдать запрос Ajax (я считаю, это должен быть синхронный запрос) серверу, чтобы сигнализировать о закрытии окна. И синхронные звонки не так уж хороши …
С другой стороны, другому браузеру придется вытащить сервер с другим запросом Ajax, чтобы увидеть, когда какой-то пользователь вышел из системы.
Все эти запросы Ajax делают уродливое решение.
Обновить:
Как сказал Торарин и Джонатан Финнгленд, могут возникнуть проблемы с несколькими окнами (не вкладки, как window.onclose fire on windows not tabs), но я считаю, что есть решение этой проблемы. Если в первом окне задается файл cookie number_of_windows
= 1, который увеличивается для каждого открытого окна, то при закрытии окна запрос Ajax запускается только в том случае, если number_of_windows
равен 1, иначе он просто уменьшает number_of_windows
.
Обновление 2:
Вышеупомянутое решение действительно вызвало бы проблемы с несколькими открытыми вкладками. Я думаю, как облегчить это.
Обновление 3:
Хорошо, я понял какое-то решение, но он не работает в IE6, не знаю о другой версии IE. В приведенном ниже фрагменте отслеживается количество открытых окон и вкладок (за исключением IE, который не обновляет document.cookie в режиме реального времени между окнами, но я считаю, что он может быть решен с некоторыми собственными функциями IE). Затем на каждой странице разгружается, что означает даже перемещение со страницы на страницу на том же веб-сайте, скрипт проверяет, сколько открытых окон. Если это единственное открытое окно / вкладка, то он выдает запрос Ajax. Это первая часть решения. Теперь вторая часть.
На стороне сервера скрипт, который запрашивает вызов Ajax, должен обновить некоторую запись в БД, говорящую, что пользователь, возможно , закрыл страницу. Как вы оцениваете, не просто ли она получает доступ к новой странице вашего сайта? Простой доступ на каждую страницу вы проверяете БД для значений «возможно, вышли из системы» для этого сеанса, и если вы указали их как ложные (пользователь вошел в систему), в противном случае пользователь будет выходить из системы в БД (true флаг).
Это грязно, но это единственное решение, которое мне пришло в голову, поскольку я не мог определить перезагрузку страницы и т. П. В JavaScript. Кроме того, я не проводил обширного тестирования, это больше идея. Во всяком случае, я бы не рекомендовал это решение . Запрос Ajax для каждой измененной страницы является излишним и буквально удваивает количество просмотров на сервере, не считая опроса, сделанного другими браузерами.
Вот фрагмент. Кстати, bakery.js – небольшая обертка для document.cookie. Вы можете найти его источник здесь, на github .
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> <script type="text/javascript" src="bakery.js"></script> <script type="text/javascript"> var logout = function() { var xhr = new XMLHttpRequest; xhr.open("GET", "logout.php", false); xhr.send(null); }; window.onload = function() { var winNumber = parseInt(IGS.Bakery.getCookie("winNumber"), 10) || 0; IGS.Bakery.setCookie("winNumber", winNumber + 1); }; window.onunload = function() { var winNumber = parseInt(IGS.Bakery.getCookie("winNumber"), 10) || 0; IGS.Bakery.setCookie("winNumber", winNumber - 1); if (winNumber === 1) { logout(); } }; var showCookies = function() { alert(IGS.Bakery.getCookie("winNumber")); }; </script> </head> <body> <a href="#" onclick="showCookies();">show</a> </body> </html>
Забыл упомянуть. window.onclose не является межсерверным.
Вы можете использовать JavaScript для реализации события OnUnload и использовать AJAX для связи с пользователем, уходящим на сайт. Однако событие также происходит, когда они переходят на другую страницу. Вам нужно будет реализовать что-то вроде «если пользователь не запрашивает новую страницу за x секунд», он покинул мой сайт, но он никогда не будет надежно работать, если учесть возможность открытия нескольких окон.
Единственный способ сделать это – сделать регулярные обратные передачи AJAX на сервер, чтобы пользователь все еще находился на вашей странице. Тем не менее, это было бы не мгновенно.
Вы можете попробовать экспериментировать со сценарием, который вы отправляете обратно. Постройте в течение значительного периода ожидания, прежде чем отвечать. Когда пользователь переходит от вашей страницы, браузер, вероятно, прекратит выполнение XmlHttpRequest. Сценарий на стороне сервера может зарегистрировать отключение клиента и сделать вывод о том, что пользователь ушел … снова, если они не перейдут на загрузку другой страницы.
Короче говоря, нет определенного способа сделать это чистым способом.
Вы можете отделить понятия «показ как вход в систему» на самом деле вошедшем в систему. Например, каждый раз, когда пользователь запрашивает страницу, вы можете пометить их как «онлайн» еще несколько минут, но вы можете установить их фактический тайм-аут входа в течение нескольких часов , В этой схеме, если пользователь ушел со своего компьютера, сайт через несколько минут покажет их как «офлайн», но они все равно могут вернуться примерно через час или около того и не должны заходить в систему.