Как реализовать блокировку данных, которые в данный момент просматривает пользователь - PullRequest
1 голос
/ 05 октября 2011

Утренние гуру,

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

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

Я частично реализовал это, сделавbean-компонент Application Scoped, в котором хранится карта маршрутов, просматриваемых пользователями, для которых указан их идентификатор сеанса.

Bean-компонент Application Scoped обновляется, когда поддерживающий компонент страницы получает маршруты из базы данных.Я написал Фильтр, который удаляет просмотренные маршруты из bean-объекта Application Scoped, когда пользователь покидает страницу.

Все это прекрасно работает: -)

Но если пользователь покидает страницу либозакрытие вкладки браузера / закрытие браузера или сеанс, срок действия которого истекает, мой код очистки обойден.

У кого-нибудь есть предложения, как

  1. можно заставить мой код очистки запускаться довкладка / браузер закрывается / сессия истекает.
  2. Я могу получить доступ к сеансам для всех пользователей в моем компоненте области приложения (поэтому я могу выполнять итерации по ним и создавать карту отслеживаемых маршрутов каждый раз, когда она запрашивается)
  3. Идея лучшего решения.

Я работаю с JSF / Icefaces 2.

Спасибо за ваше время.

Ответы [ 3 ]

2 голосов
/ 05 октября 2011

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

Если вы можете справиться с сохранением блокировок до разрушения сеансадобавьте HttpSessionListener и выполните очистку после уничтожения сеанса.

Если вы можете обрабатывать задержки в 10 секунд, добавьте периодический запрос на веб-странице (либо через AJAX / JS, либо черезневидимое IFRAME, которое перезагружает определенную страницу с вашего сервера) и имеет Filter, который помечает время последнего доступа из браузера в сеансе пользователей или в компоненте Application Scpoed, который у вас уже есть.Отдельный поток просыпается каждые N секунд, сканирует сеансы с заблокированными объектами, которые старше M секунд, и разблокирует их.

Если вам нужно немедленное уведомление, установите обработчик события onbeforeunload, который уведомляет сервер.Кроме того, вы можете сделать это с постоянным соединением или WebSocket.

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

0 голосов
/ 05 октября 2011

Вы можете добавить периодический (например, раз в минуту) вызов AJAX на свою страницу, который поддерживает блокировку.

0 голосов
/ 05 октября 2011

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

...