2011-01-16 3 views
1

есть способ проверить, есть ли активный сеанс непосредственно на странице jsf? меня попробовать это, но он не работает:Как проверить, есть ли активный сеанс на странице JSF?

<p:ajaxStatus onerror="#{session == null ? 'idleDialog.show();' : null}" 

спасибо заранее

@Update меня видеть, что OnError не уволили, даже если viewExpiredException occurr.

+1

Связанный вопрос: http://stackoverflow.com/questions/2319020/mvc-with-jquery-handling-session-expire – BalusC

+0

Согласно вашему обновлению, вы используете кандидат на выпуск PrimeFaces вместо окончательной версии? 2.2 У RC1 есть ошибка: http://code.google.com/p/primefaces/issues/detail?id=1471 Это совсем другая история. – BalusC

ответ

3

Всегда существует активная сессия во время оценки EL. Если перед открытием страницы ее не было, она автоматически создается.

В JSF истекающие сеансы являются проблемой из-за так называемого «метода экономии состояния». По умолчанию состояние сгенерированной страницы сохраняется в сеансе. Если вы попытаетесь отправить форму и срок ее действия истек, состояние будет потеряно и, следовательно, возникнет ошибка.

Но даже в этом случае создается новый сеанс. Так, как было отмечено BalusC, вы можете сохранить сессию живой - опрос с запросами AJAX (например, RichFaces имеет такие объекты), так что сессия никогда не истекает

+0

Да, я знаю это, но мне нужно проверить, закончился ли сеанс и открыть диалоговое окно для восстановления сеанса. –

+1

Как бы вы хотели восстановить сеанс, если он истек? Вы предпочитаете либо поддерживать сеанс до тех пор, пока пользователь активен на странице, либо перенаправляется на страницу ошибки/входа сразу после окончания сеанса. – BalusC

+0

Я могу создать новый сеанс, просто показывая кнопку h: в диалоговом окне, поэтому пользователь нажимает на него, и это генерирует новый сеанс. @Bozho да используя ajax. в web.xml не wok –

0

Вы можете использовать следующее выражение EL в JSF 2.0:

#{facesContext.externalContext.getSession(false) == null}

Обратите внимание, что ссылка на неявный объект EL session автоматически (повторно) создаст его снова. Таким образом, этого никогда нельзя использовать для тестирования.

E.g.

Предположим, вы бы аннулировал сессию в бэк-боба, и Facelet следующего содержания было вынесено:

#{facesContext.externalContext.getSession(false) == null} 
#{session.new} 
#{facesContext.externalContext.getSession(false) == null} 

Это сделало бы:

true true false 

Сеанс первый действительно ушел , но, ссылаясь на неявный объект EL, он снова создается (и будет находиться в новом состоянии). Затем второй тест обнаруживает, что сессия снова появится.

+2

Хотя технически это правильно, это не отвечает первоначальным функциональным требованиям OP для отображения предупреждения/диалога JS всякий раз, когда сеанс истек, пока страница все еще открыта в браузере. В вашем ответе предполагается, что клиент должен вручную запустить совершенно новый синхронный HTTP-запрос после истечения срока действия сеанса (и что на странице не задействованы управляемые компоненты, зависящие от сеанса/вида). Тем не менее я должен признать, что ОП действительно не выразил этого достаточно ясно в вопросе. – BalusC

+0

Да, вы правы. Я сосредоточился исключительно на заголовке вопроса «Как проверить, есть ли активный сеанс на странице JSF?». Для достижения того, чего хочет OP на функциональном уровне, требуется немного больше. Я думаю о строках приостанавливаемого запроса async Servlet 3.0, который возобновляется при возникновении события с истекшим сроком сессии. У меня еще нет опыта с этим, поэтому я не чувствую себя комфортно, предоставляя это в качестве ответа. –

Смежные вопросы