В моем приложении php я использую $ _SESSION для отслеживания входа пользователя в систему. Если пользователь покидает любую страницу на моем сайте по адресу http://mysite.com и отправляется на сайт http://someotherwebsite.com , я хочу чтобы автоматически вывести их из системы, чтобы, если они вернутся на любую страницу на странице http://mysite.com , им необходимо снова войти в систему.
Есть простой способ сделать это?
Вы не можете явно указывать, когда пользователь покидает ваш сайт, лучшим вариантом будет выполнение тайм-аута на ваших сеансах.
Как было сказано в большинстве ответов, вы можете проверить событие JavaScript onbeforeunload
но пользователь может обойти это, отключив JavaScript или, как указал BalusC , используя веб-браузер, который его не поддерживает, например Opera.
Поэтому я твердо верю, что выполнение тайм-аута в ваших сеансах – лучший способ принудительного выхода из системы.
Вы можете выполнить вызов AJAX в событии onbeforeunload для некоторого сценария на стороне сервера, который убьет сеанс.
Если не считать тайм-аут на ваших сеансах, на самом деле. Единственный способ, который приходит на ум – это событие onbeforeunload
JavaScript, которое запускается, когда пользователь покидает текущую страницу, но это событие не знает, куда идет пользователь. Однако, если вы действительно хотите это сделать, возможно, создайте что-то, основанное на следующем хакерском обходном пути (untested):
установите событие onbeforeunload
которое отправляет вызов AJAX на ваш сервер. (Как это сделать успешно, поэтому вызов проходит до закрытия страницы – это проблема сама по себе, поиск «onbeforeunload ajax» на SO должен дать некоторые результаты.
В результате вызова Ajax начнется обратный отсчет, говорящий, что сессия этого пользователя вот-вот умрет, скажем, пятнадцать секунд.
Если пользователь покидает ваш сайт, обратный отсчет применяется.
Если пользователь отправляется на другую страницу вашего сайта, вы очищаете обратные отсчеты «умирать» при обслуживании следующей страницы.
Это, вероятно, будет шатким, потому что может случиться так, что запрос Ajax, начинающий отсчет, приходит на сервер после того, как следующая страница уже удалила этот обратный отсчет. Но если вам действительно нужно это сделать, это может быть направление. Разумеется, работает только для пользователей с поддержкой JS.
Вторая идея, как реализовать это, состоит в том, чтобы поставить чрезвычайно низкий тайм-аут на сеансы (например, 90 секунд) и поставить iframe
на каждую страницу, которую вы обслуживаете. Тогда iframe будет звонить на страницу каждые 60 секунд.
Это будет работать без JavaScript, но может вызвать раздражающие щелчки в более старых версиях Internet Explorer (я не знаю, остановилось ли это в 6 или 7?)
Вы не можете (но ваши сеансы будут автоматически отключены через некоторое время, поэтому вы можете установить таймаут на короткое время).
Из того, что я знаю о PHP (что не так много), ваше приложение когда-либо узнает, что они покинули сайт? Если вы перейдете на сайт someotherwebsite.com, ваш код не будет вызываться снова, пока он не вернется.
К сожалению, нет, это одна из больших проблем с веб-приложениями. Ваши приложения не знают, что браузер перешел на другой сайт.
Как упоминает ChristohpeD, вы можете установить тайм-аут сеанса. Просто помните, что ваш сайт будет обновлять только время, когда сервер получает сообщение или какой-то javascript-пинг.
Надеюсь, это поможет