Тайм-аут сеанса JSF 2.0 вызывает исключение IllegalStateException - PullRequest
0 голосов
/ 25 октября 2011

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

Я получаю следующее исключение, когда пытаюсь нажать на любую кнопку после того, как сеанс завершился.timedout:

java.lang.IllegalStateException
org.apache.catalina.connector.ResponseFacade.reset(ResponseFacade.java:310)
com.sun.faces.context.ExternalContextImpl.responseReset(ExternalContextImpl.java:821)
com.sun.faces.context.ExceptionHandlerImpl.throwIt(ExceptionHandlerImpl.java:251)
com.sun.faces.context.ExceptionHandlerImpl.handle(ExceptionHandlerImpl.java:141)
com.sun.faces.lifecycle.Phase.doPhase(Phase.java:119)
com.sun.faces.lifecycle.RestoreViewPhase.doPhase(RestoreViewPhase.java:113)
com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
javax.faces.webapp.FacesServlet.service(FacesServlet.java:395)

В моем web.xml есть следующие записи:

<error-page>
    <exception-type>javax.faces.application.ViewExpiredException</exception-type>
    <location>/content/country/default/jsp/login.faces</location>
</error-page>
<error-page>
    <exception-type>java.lang.Throwable</exception-type>
    <location>/content/country/default/jsp/error.faces</location>
</error-page>

Кусок кода из PhaseListener -

try{
    log.info("------------Check the method call-----------");
    if (log.isDebugEnabled())
        log.info("Authentication is needed.  Navigating to login page.");
    nh.handleNavigation(fc, null, NavigationConstants.LOGIN_FAILURE.toString());
    return;
}catch(ViewExpiredException ve){
    log.info("Got the view expired exception. . . ");
    FacesContext.getCurrentInstance().getExternalContext().redirect("login.faces");
}catch(IllegalStateException e){
    log.info("Got the IllegalStateException . . ");
    FacesContext.getCurrentInstance().getExternalContext().redirect("login.faces");
}catch(Exception ex){
    log.info("Got the Exception . . ",ex);
    FacesContext.getCurrentInstance().getExternalContext().redirect("login.faces");

1 Ответ

0 голосов
/ 25 октября 2011
java.lang.IllegalStateException
org.apache.catalina.connector.ResponseFacade.reset(ResponseFacade.java:310)

Вы получили это исключение , потому что ответ уже принят.

com.sun.faces.context.ExternalContextImpl.responseReset(ExternalContextImpl.java:821)
com.sun.faces.context.ExceptionHandlerImpl.throwIt(ExceptionHandlerImpl.java:251)
com.sun.faces.context.ExceptionHandlerImpl.handle(ExceptionHandlerImpl.java:141)
com.sun.faces.lifecycle.Phase.doPhase(Phase.java:119)
com.sun.faces.lifecycle.RestoreViewPhase.doPhase(RestoreViewPhase.java:113)

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

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

Независимо от того, ваше ниже функциональное требование интригует меня:

Я должен выйти из системы после тайм-аута сеанса. Я использую EventListenter для очистки сессии

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

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