Как отслеживать статус пользователя онлайн? - PullRequest
4 голосов
/ 15 декабря 2009

Я хотел бы захватить следующие параметры:

lastAccessedTime - время, когда пользователь посещал сайт в последний раз (обычно отображается в процессе входа в систему)

isOnline - логическое значение, представляющее, подключен ли пользователь к сети или нет.

а. Имеет ли смысл иметь эти переменные как часть самой таблицы User или это должно обрабатываться через отдельную таблицу аудита пользователей?

б. Если некоторые API SOAP / REST предоставляют функциональность через вызовы API, как вы отслеживаете вышеуказанные параметры (например, изменили ли вы lastAccessedTime в таких случаях - это может сбить пользователя с толку при входе в портал, бит isOnline также не будет иметь смысла если пользователь выполняет вызовы API).

Ответы [ 4 ]

6 голосов
/ 15 декабря 2009

Я бы создал сеансовую таблицу, которая ссылается на пользователя. Вместо поля isOnline я бы просто запустил запрос для сеансов, которые были активны в течение последнего x промежутка времени. Я также обновляю это поле сеанса с каждым запросом, даже если этот запрос поступает через API.

Это создает некоторые издержки при удалении таблицы сеанса, но вы также не загромождаете свою пользовательскую таблицу информацией, не являющейся пользователем, которую нельзя удалить.

3 голосов
/ 15 декабря 2009

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

1 голос
/ 15 декабря 2009

Самая большая проблема с отслеживанием присутствия пользователя (onine / offline) по HTTP - как определить, когда пользователь перешел в автономный режим.

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

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

Самой простой реализацией было бы использование lastTimeActive, как предложил Джонатан Сэмпсон. Однако это не даст вам длительности сеанса пользователя, а лишь приблизителен к тому, кто сейчас находится в сети.

Более сложный подход - использовать lastTimeActive и lastTimeLoggedIn. LastTimeLoggedIn устанавливается во время первого запроса на аутентификацию, который составляет более 5 минут от предыдущего запроса на аутентификацию. Пользователь считается онлайн, если за последние пять минут был запрос с проверкой подлинности. Продолжительность сеанса для пользователя - это разница во времени между lastTimeActive и lastTimeLoggedIn.

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

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

1 голос
/ 15 декабря 2009

Я бы создал другую таблицу (userid, lastTimeActive) и часто обновлял и проверял таблицу.

// update
update onlineusers set lastTimeActive = getdate() where userid=1234

// check
delete from onlineusers where lastTimeActive < dateadd(minute,-5,getdate())
...