2010-10-15 2 views
1

Возможно ли предотвратить открытие пользователем страницы JSF в нескольких вкладках или окнах браузера?Запретить пользователю открывать страницу JSF более чем в одной вкладке/окне в браузере

+0

Просьба подробно об этой проблеме, для которой вы думали, что это Солу а не спрашивать, как добиться решения, которое, по сути, не может быть правильным решением. – BalusC

+0

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

ответ

2

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

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

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

+0

или используйте SEAM. =) http://seamframework.org/ – bungrudi

+0

Я бы не интегрировал Seam в существующее приложение JSF. – BalusC

+0

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

0

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

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

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

1

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

На стороне 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 

Backend: (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)