window.onload event
От: zappy  
Дата: 03.11.08 15:39
Оценка:
Привет!

Такая проблема:

Есть пользователь, залогинен, нажимает на 'X'(закрыть вкладку/браузер) либо Ctrl+F4.
Необходимо разлогинить пользователя.

Для этого идеально подошло бы событие window.onclose, но, к сожалению, его не существует.
OnUnload не подходит, т.к. оно происходит ещё при перезагрузке и редиректе.
OnBeforeUnload тоже не катит, т.к. это событие возникает ещё и при постбэке.

Какое альтернативное решение можно использовать в данном случае?

Спасибо за помощь!
Re: window.onload event
От: Панда Россия  
Дата: 03.11.08 16:47
Оценка:
Можно логинить в сессию, а id сессии передавать через GET-переменную, если это допустимо. Тогда закрыл вкладку с адресом — потерял сессию.
Re: window.onload event
От: Mikhail Polykovsky Россия  
Дата: 03.11.08 16:52
Оценка: +1
Здравствуйте, zappy, Вы писали:

Z>Привет!


Z>Такая проблема:


Z>Есть пользователь, залогинен, нажимает на 'X'(закрыть вкладку/браузер) либо Ctrl+F4.

Z>Необходимо разлогинить пользователя.

Если залогиненный пользователь запоминается кукой, достаточно не указывать её expire time. Она умрет при закрытии браузера.


Z>Для этого идеально подошло бы событие window.onclose, но, к сожалению, его не существует.

Z>OnUnload не подходит, т.к. оно происходит ещё при перезагрузке и редиректе.
Z>OnBeforeUnload тоже не катит, т.к. это событие возникает ещё и при постбэке.

Z>Какое альтернативное решение можно использовать в данном случае?


Z>Спасибо за помощь!
Re[2]: window.onload event
От: Панда Россия  
Дата: 03.11.08 16:54
Оценка:
Правда, такое решение не очень секьюрно — адрес с id сессии может остаться в выпадающем списке адресной строки браузера. Но я не знаю, зачем вам понадобилось разлогинивать именно при закрытии закладки, а не всего браузера, поэтому не могу судить, насколько это критично.
Re[3]: window.onload event
От: zappy  
Дата: 04.11.08 21:26
Оценка:
П>Правда, такое решение не очень секьюрно — адрес с id сессии может остаться в выпадающем списке адресной строки браузера.

Да, это точно =)
А можно ли как-нибудь завершить текущую сессию сразу после закрытия, а не ждать таймаута??

П>Но я не знаю, зачем вам понадобилось разлогинивать именно при закрытии закладки, а не всего браузера, поэтому не могу судить, насколько это критично.


Необходимо разлогинивать при окончании работы с сайтом. А это происходит и при закрытии сайта, и при закрытии вкладки.
Re[2]: window.onload event
От: zappy  
Дата: 04.11.08 21:28
Оценка:
MP>Если залогиненный пользователь запоминается кукой, достаточно не указывать её expire time. Она умрет при закрытии браузера.

К сожалению, это сработает только если закрыть браузер.
Если же закрыть вкладку, то кука не умрёт..
Re[4]: window.onload event
От: Панда Россия  
Дата: 05.11.08 10:18
Оценка:
Здравствуйте, zappy, Вы писали:

П>>Правда, такое решение не очень секьюрно — адрес с id сессии может остаться в выпадающем списке адресной строки браузера.


Z>Да, это точно =)

Z>А можно ли как-нибудь завершить текущую сессию сразу после закрытия, а не ждать таймаута??

Ну разве что как-то очень хитро извратиться. Если очень нужно, то вот, например, какой способ приходит в голову. У каждого окна (в том числе у каждой вкладки) имеется такой аттрибут, как window.name. Он не меняется при перезагрузке содержимого, но потеряется при закрытии вкладки. Поэтому нам надо суметь запихнуть сессию в него.

1. Может быть, придется реализовать некий свой механизм сессий (хотя может и удастся сделать все это на стандартном).
2. id сессии запихиваем в window.name яваскриптом при первой загрузке страницы (при повторной обнаруживаем, что window.name уже установлен и не трогаем его).
3. Часть содержимого страницы, требующую проверку сессии, грузим с помощью AJAX, передавая в запрос id сессии, выколупанный из window.name.

При закрытии вкладки window.name теряется, и сессию обратно не восстановить.

Но я бы не стал все это делать без явной необходимости. Есть много сайтов, где предусмотрено разлогинивание по окончанию работы с сайтом. При этом везде разлогинивание происходит при закрытии браузера, а не вкладки. Вполне стандартная схема, нормально работает и выполняет свою задачу, все к ней привыкли. Я бы не стал от нее отклоняться, если только у сайта действительно нету какой-то важной особенности, требующей другой схемы разлогинивания (но я пока что такую особенность даже гипотетически придумать не могу)
Re[5]: window.onload event
От: Панда Россия  
Дата: 05.11.08 10:41
Оценка:
Описанную мной выше схему, видимо, вполне можно сделать на стандартных сессиях, хранимых в куках.

1. Когда отдаем страницу, в нее встраиваем яваскрипт, инициализирующий строковую переменную x. Значение ее генерируем каждый раз случайно. Например, получилось "var x= 'JHd76skjs76'"

2. Страница содержит также яваскрипт, проверяющий, начинается ли window.name с подстроки "BUGAGA". Если да, то ничего не делает, если нет, то устанавливает window.name = "BUGAGA"+x. То есть, у нас получается window.name = "BUGAGAJHd76skjs76", и при дальнейших обновлениях вкладки не меняется;

3. При процедуре логина мы выколупываем из window.name строку "JHd76skjs76" и передаем ее вместе с логином и паролем.

4. Сервер, получив логин и пароль, получает также эту строку и сохраняет информацию о залогинившемся в $_SESSION["JHd76skjs76"]

5. Страница грузит в себя доступную только залогинившимся часть с помощью AJAX-запроса. В этот запрос она добавляет GET-переменную "MYTRICKYSESSID=JHd76skjs76". На стороне сервера мы проверяем, есть ли информация о залогиненном в $_SESSION[$_GET["MYTRICKYSESSID"]], если есть, то считаем его авторизованным.
Другой вариант, альтернативный AJAXу — грузить часть страницы в iframe, установив ему яваскриптом src c GET-переменной MYTRICKYSESSID=JHd76skjs76.


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