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

StackOverflow https://stackoverflow.com/questions/334114

Вопрос

Я вношу изменения в сайт на основе пользователей, владелец которого хочет иметь возможность отслеживать время, проведенное на сайте (вход / выход из системы) для всех пользователей в серверной части базы данных.Войти в систему очень просто;существует одна точка входа (форма входа в систему), и в результате логины могут быть отправлены в базу данных, как только они появятся.

Выход из системы, однако, немного сложнее, поскольку, если пользователь не нажимает "выйти", чтобы явно сообщить нам, что он уходит, решение становится более сложным (и как часто пользователи в самом деле нажмите кнопку выйти из системы?).Одной из возможностей (только с точки зрения отслеживания общего времени пребывания на сайте) было бы зарегистрировать каждую загруженную страницу в базе данных и связать ее с пользователем, который ее загрузил;проблема в том, что сайт является сайтом доставки видео на основе членства (не то, что вы думаете!), и их последним просмотром страницы, скорее всего, будет двадцатиминутное или тридцатиминутное видео.Нам также нужно зафиксировать время, потраченное на последнюю страницу, а не только время ее загрузки.

Я подумал о двух возможных решениях, ни одно из которых не является таким уж элегантным.Первым было бы перехватить все события "выгрузки" с помощью javascript и зарегистрировать вызов "выхода из системы".php' (это при условии, что XMLHttpRequest или что-то еще не исчезнет, как только страница будет выгружена);проблема заключается в том, что внутренние ссылки также регистрируются как события выгрузки, поэтому нажатие на любую ссылку приведет к выходу пользователя из системы (вы могли бы установить флаг в обработчике 'unload' и установить этот флаг для всех внутренних ссылок - это несложно сделать динамически, но немного запутанно).Другой подход включал бы установку интервала для пинга базы данных каждые 60 с или около того, что позволяет нам знать, что пользователь все еще находится на сайте, а затем выполнять некоторую математику при извлечении истории пользователя, чтобы вычислить общую продолжительность этого сеанса;это тоже кажется несколько халтурным.Кроме того, ни одно из этих решений не работает для пользователей с отключенным JS.

Похоже, что эта проблема не такая уж необычная, и должен быть лучший способ;существует ли передовой подход к решению этой проблемы?Если нет, видите ли вы какой-либо способ улучшить любое из этих решений?

Это было полезно?

Решение

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

Теперь вы могли бы немного улучшить это, поместив ajax-запрос в таймер на каждой странице (возможно, один или два раза в минуту), чтобы обеспечить "сердцебиение", но здесь также есть некоторые оговорки:Вам нужно убедиться, что сеанс все равно в конечном итоге завершится, и вам по-прежнему не гарантировано, что пользователь не заблокирует эти запросы, возможно, отключив javascript.

Другие советы

Я добился хорошего успеха с использованием timer в javascript для пинга сервера.В моем случае сайту требуется javascript, так что это не проблема.Я также использую этот механизм для выполнения проверки, которая предотвращает вход в систему одной учетной записи с двух разных компьютеров, поэтому есть более веские причины для этого взлома.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top