Запретить пользователю открывать страницу JSF в нескольких вкладках / окнах браузера - PullRequest
1 голос
/ 15 октября 2010

Можно ли запретить пользователю открывать страницу JSF в нескольких вкладках или окнах браузера?

Ответы [ 3 ]

3 голосов
/ 15 июля 2017

Я согласен с принятым решением, но если вам все еще нужно это сделать, эти шаги сработали для меня (псевдокод / ​​псевдопайтон):

На стороне JS:

if tabId not set:
  . generate random number 
  . set property in sessionStorage
otherwise:
  . get it from sessionStorage
make an ajax callback and send tabId
onError:
  . alert(); 
  . close current tab (if possible);
  . logout

Бэкэнд: (JSF) :

Create custom filter:
  if request contains the tabId info:
    if it matches session's tabId: (being tabId not null)
      sent response status code to an error such as forbidden
      Optionally invalidate session
  otherwise apply session filtering (do nothing)
2 голосов
/ 15 октября 2010

@ BalusC Проблема касается старого приложения JSF с полным состоянием. Зачем пытаться найти способ информировать пользователей о том, что открытие приложения на двух отдельных вкладках потенциально опасно. Мы никоим образом не можем изменить управляемые сессионными компонентами, чтобы запросить управляемые компоненты.

Сделайте все эти запросы bean-объектов бобами установленными, установите Tomahawk , добавьте <t:saveState value="#{bean}" /> для каждого компонента, для каждого представления которого вы хотите сохранить точно такое же состояние компонента в следующем запросе. Это работает независимо от вкладок / окон.

Без Tomahawk альтернативой будет добавление <h:inputHidden /> для каждого свойства бина, которое вы хотели бы сохранить в следующем запросе. Однако я могу себе представить, что это может привести к неприятному шаблонному коду, когда их много или они не имеют стандартных типов EL (для которых вам, таким образом, нужно создать Converter). Но за это тебе платят.

0 голосов
/ 15 октября 2010

Один сценарий, который я имею в виду: Поместите на страницу компонент javascript, который будет постоянно отправлять пульс на сервер через AJAX. Пока из браузера отправляется пульс, эта страница будет помечена как «now_viewing». И если на странице установлен этот флаг, другие запросы на эту страницу должны быть отклонены.

Детали могут быть намного более запутанными, чем эта простая история (например, вам может потребоваться какой-то «идентификатор страницы» для отправки с биением сердца), но вы поняли идею (... я надеюсь :).

Все возможно, если вы готовы заплатить цену.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...