Chertenok.ru - все о программировании
Вход  |  Регистрация  |  Поиск 
Праздник
Завтра :

День славянской письменности и культуры


Логаут при закрытии окна броузера


Новая тема  Ответить  Печать Предыдущая тема  Следующая тема
Автор Сообщение
Пол:Жен Kate
Постоянный участник


Возраст: 27
Знак зодиака: Стрелец
Зарегистрирован: 04.06.2007
Сообщения: 149

СообщениеСр, 24-Окт-2007 19:05    Заголовок сообщения: Логаут при закрытии окна броузера
Цитата

Есть на сайте авторизация хранящаяся в сессии. Есть необходимость отображать в реальном времени всех залогинившихся пользователей, к примеру, посредством изменения булевного поля состояния (true=активен, false=неактивен) в таблице, хранящей данные о пользователях. Элементарно - при ЛОГИНЕ - изменять вышеуказанное поле в соответстующей записи таблицы на TRUE, а при ЛОГАУТЕ - на FALSE. Никаких вопросов когда ЛОГАУТ происходит по ссылке к примеру.

ВОПРОС. Но как сделать вышеописанную обработку логаута (изменять таблицу пользователей) при закрытии окна броузера? Ведь в PHP же нет обработчика события типа onClose или хотя бы onUnload. Улыбка
В начало
Посмотреть профиль Отправить личное сообщение
Пол:Муж NikotiN
Розовый мамонт


Возраст: 26
Знак зодиака: Овен
Зарегистрирован: 18.03.2005
Сообщения: 2137

СообщениеСр, 24-Окт-2007 20:11 
Цитата

проверять активность, если он, допустим, за 10 мин не подал признаков жизни, то усё, значит вышел
_________________
Сила дурака в том, что умный перед ним бессилен.
В начало
Посмотреть профиль Отправить личное сообщение
Пол:Жен Kate
Постоянный участник


Возраст: 27
Знак зодиака: Стрелец
Зарегистрирован: 04.06.2007
Сообщения: 149

СообщениеСр, 24-Окт-2007 20:40 
Цитата

NikotiN,
как человеку подать признаки жизни? Улыбка Я например это решила делать, как указано выше, изменением поля state (состояние активности) в таблице users на TRUE - когда он активный (мгновенно когда логинится), и на FALSE - когда делает ЛОГАУТ, либо при закрытии страницы (также мгновенно). С изменением на TRUE поля state разумеется не проблем, также как с изменением на FALSE, но только при "ручном" ЛОГАУТЕ (нажатии на ссылку). А как сделать чтобы изменялось вышеуказанное поле при ЗАКРЫТИИ браузера?

У тебя есть какие-то другие предложения как подать признаки жизни? Я так поняла в фоновом режиме? Скромный
В начало
Посмотреть профиль Отправить личное сообщение
Пол:Муж NikotiN
Розовый мамонт


Возраст: 26
Знак зодиака: Овен
Зарегистрирован: 18.03.2005
Сообщения: 2137

СообщениеСр, 24-Окт-2007 20:48 
Цитата

всмысле, он что-то сделал, типа зашёл куда-то, нажал на ссылку и т.п. - ты обновляешь запись в бд (например возвращяешь счётчик на 10000 = 10мин).
в то же время, у тебя происходит обновление таблицы путём вычитания 1 каждую секунду (ну это для примера, а то не правильно)))) )
как только у кого-то счётчик равен 0, то значит он 10 мин ничего не делал, делаем ему логаут

_________________
Сила дурака в том, что умный перед ним бессилен.
В начало
Посмотреть профиль Отправить личное сообщение
Пол:Жен Kate
Постоянный участник


Возраст: 27
Знак зодиака: Стрелец
Зарегистрирован: 04.06.2007
Сообщения: 149

СообщениеСр, 24-Окт-2007 21:04 
Цитата

Т.е. в каждой странице и скрипте разместить запрос к БД такого рода: UPDATE USERS SET timer=10000 WHERE userid=[ID юзера] - что будет означать залезание пользователя на страницу, а значит и присутствие его на сайте. ОК, с этим понятно.
Тогда еще вопрос - как сказать СУБД (у меня сейчас MySQL) чтобы она изменяла поля ("вычитала 1 каждую секунду") через определенный интервал времени? (вроде триггер надо написать? а в нем же только 3 события - изменение, добавление и удаление, если я не ошибаюсь, в MySQL)
В начало
Посмотреть профиль Отправить личное сообщение
Пол:Муж NikotiN
Розовый мамонт


Возраст: 26
Знак зодиака: Овен
Зарегистрирован: 18.03.2005
Сообщения: 2137

СообщениеСр, 24-Окт-2007 21:23 
Цитата

мммм, может не выставлять таймер на 10000, а записывать время последнего действия.
а при обновлении статистики сравнивать текущее время с временем последнего действия пользователя =)
я просто в бд не особо разбираюсь, так что не могу сказать как там сделать таймер или нечто подобное)

_________________
Сила дурака в том, что умный перед ним бессилен.
В начало
Посмотреть профиль Отправить личное сообщение
DrPass
Знающий :)
/Почетный Модератор/


Возраст: 31
Знак зодиака: Лев
Зарегистрирован: 02.05.2002
Сообщения: 5709
Откуда: Донецк
СообщениеСр, 24-Окт-2007 21:30 
Цитата

Цитата:
Тогда еще вопрос - как сказать СУБД (у меня сейчас MySQL) чтобы она изменяла поля ("вычитала 1 каждую секунду") через определенный интервал времени?

Никак не надо. Просто храни в таблице не какие-то там счетчики, а время последней активности пользователя. В запросе "показать активных пользователей" достаточно будет выгрести список пользователей, время активности которых отличается от текущего на установленный тобой интервал.
Понятия "логаут" в веб-приложениях не существует. Т.к. нет понятия "сеанс работы" - при выполнении любой операции клиент выполняет коннект, забирает результат и делает дисконнект от сервера. Все. Сервер понятия не имеет, что там клиент делает у себя после дисконнекта.

_________________
Да пребудет с вами Сила!
В начало
Посмотреть профиль Отправить личное сообщение
Пол:Жен Kate
Постоянный участник


Возраст: 27
Знак зодиака: Стрелец
Зарегистрирован: 04.06.2007
Сообщения: 149

СообщениеСр, 24-Окт-2007 21:36 
Цитата

дадада - точно! голова тяжелая сегодня - не догадалась сразу, разумеется так можно. Спасибо за напоминание NikotiN и DrPass =)
но тем не менее, вопрос остается открытым - есть ли возможность в MySQL изменять поле через опр. интервал времени? Вопрос ради интереса.

Также еще один открытый вопрос, поставленный в начале темы, есть ли возможность все таки изменять поле именно при ЗАКРЫТИИ браузера? Ведь все же есть смысл видеть пользователя как авторизированного даже если он ничего не делает на сайте хоть час и больше, но не закрыл его.
В начало
Посмотреть профиль Отправить личное сообщение
DrPass
Знающий :)
/Почетный Модератор/


Возраст: 31
Знак зодиака: Лев
Зарегистрирован: 02.05.2002
Сообщения: 5709
Откуда: Донецк
СообщениеСр, 24-Окт-2007 22:21 
Цитата

to Kate
Цитата:
есть ли возможность в MySQL изменять поле через опр. интервал времени?

Нет, как и в любой другой СУБД. Это должна быть внешняя программа, или сервис какой-нибудь, который обновляет таблицы.

Цитата:
есть ли возможность все таки изменять поле именно при ЗАКРЫТИИ браузера?

Ты, когда по порносайтам ходила, обратила внимание, что после закрытия окна с одним сайтом открывается еще два-три новых окна с порносайтами? Wink
Вот можно применить ту же методику. На OnCloseWindow (или как там то событие называется) запускать новую сессию, дергать с ее помощью какую-то URL, отмечающую логаут, и тут же закрывать броузер, т.к. это ж не порносайт какой-нибудь :)

Добавлено спустя 1 минуту 48 секунд:

P.S. Если у юзера броузер умеет блокировать всплывающие окна, это работать не будет

_________________
Да пребудет с вами Сила!
В начало
Посмотреть профиль Отправить личное сообщение
Пол:Муж aka57
Я живу тут....


Возраст: 28
Знак зодиака: Стрелец
Зарегистрирован: 03.07.2003
Сообщения: 1287

СообщениеЧт, 25-Окт-2007 6:17 
Цитата

Цитата:
Если у юзера броузер умеет блокировать всплывающие окна, это работать не будет


Другими словами, это не выход - бо все современные браузеры блокируют окна всплывающие по-умолчанию.
Большинство пользователей так и шастает с включенной блокировкой[/quote]
В начало
Посмотреть профиль Отправить личное сообщение
DrPass
Знающий :)
/Почетный Модератор/


Возраст: 31
Знак зодиака: Лев
Зарегистрирован: 02.05.2002
Сообщения: 5709
Откуда: Донецк
СообщениеЧт, 25-Окт-2007 19:14 
Цитата

aka57 писал(а):

Другими словами, это не выход - бо все современные браузеры блокируют окна всплывающие по-умолчанию.
Большинство пользователей так и шастает с включенной блокировкой

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

_________________
Да пребудет с вами Сила!
В начало
Посмотреть профиль Отправить личное сообщение
Пол:Муж aka57
Я живу тут....


Возраст: 28
Знак зодиака: Стрелец
Зарегистрирован: 03.07.2003
Сообщения: 1287

СообщениеПт, 26-Окт-2007 6:12 
Цитата

to DrPass

Даже как админ настроит :)
В начало
Посмотреть профиль Отправить личное сообщение
Пол:Жен Kate
Постоянный участник


Возраст: 27
Знак зодиака: Стрелец
Зарегистрирован: 04.06.2007
Сообщения: 149

СообщениеПт, 26-Окт-2007 7:47 
Цитата

Dr.Pass,
В браузере есть похожее событие только onUnload, но оно будет вызываться не только когда пользователь будет закрывать окно, но и переходить в этом же окне на другую страницу. Если даже допустить такой "порноглюк" (т.к. ни то ни се, ни всплытия попапа (т.к. он сразу закрывается, мелькнув перед глазами), ни нормального закрытия), то если он будет появляться при каждом переходе на страницы - это уже перебор LOL
В начало
Посмотреть профиль Отправить личное сообщение
Пол:Муж aka57
Я живу тут....


Возраст: 28
Знак зодиака: Стрелец
Зарегистрирован: 03.07.2003
Сообщения: 1287

СообщениеПт, 26-Окт-2007 9:30 
Цитата

Тут надо думать в терминах web:

- каждая страничка грузится в рамках новой сессии
- хранение сессий - чисто фича; тут лучше по таймауту ее грохать
- если надо такую фичу как поддержание сессии пока он открыт в браузере,
то никто не запрещает через JavaScript пинговать сайт
В начало
Посмотреть профиль Отправить личное сообщение
Показать сообщения:   
Страница 1 из 1
Перейти:  
Новая тема  Ответить  Печать

Вы можете начинать темы
Вы можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете присоединять файлы в этом форуме
Вы можете скачивать файлы в этом форуме
хостинг от .masterhost 
Rambler's Top100