Обработка «сеанса истекла» в веб-приложении JSF, работающем в JBoss AS 5 [дубликаты]

This question already has an answer here:

javax.faces.application.ViewExpiredException: View could not be restored 10 answers

Этот вопрос связан с другим моим вопросом & quot;Как перенаправить на страницу входа, когда сеанс истек в веб-приложении Java?& Quot ;. Вот что я пытаюсь сделать:

I've a JSF web application running on JBoss AS 5 When the user is inactive for, say 15 minutes, I need to log out the user and redirect him to the login page, if he is trying to use the application after the session has expired. So, as suggested in 'JSF Logout and Redirect', I've implemented a filter which checks for the session expired condition and redirects the user to a session-timed-out.jsp page, if the session has expired. I've added SessionExpiryCheckFilter on top of all other filter definitions in web.xml, so that my session expiry check will get the first hit always.

Теперь приходитchallenge I'm facing, Поскольку я использую JBoss AS, когда сеанс истек, JBoss автоматически перенаправляет меня на страницу входа (обратите внимание, что фильтр проверки истечения сеанса не вызывается). Итак, после входа в систему мой SessionExpiryCheckFilter перехватывает запрос и видит, что сеанс доступен. Но это исключениеjavax.faces.application.ViewExpiredException: viewId:/mypage.faces - View /mypage.faces could not be restored.

Кто-нибудь сталкивался с этой проблемой раньше? Есть идеи, чтобы решить эту проблему?

 Veera23 июн. 2009 г., 13:04
Нет, я не использую шов.
 Adeel Ansari23 июн. 2009 г., 12:14
Вы используете шов?
 mtpettyp26 июн. 2009 г., 22:44
Вы используете Facelets или JSP?
 Veera29 июн. 2009 г., 05:17
Я использую Facelet - JBoss Richfaces

Ответы на вопрос(5)

Когда сеанс истекает, вы можете создать новый объект сеанса и установить значение времени ожидания для нового объекта.

Просто проверьте значение таймаута в фильтре и перенаправьте браузер.

Увидетьhttp://www.java2s.com/Code/Java/Servlets/Servletsessionlistener.htm

но кое-что, как это не работает для меня, поэтому я сделал альтернатива для этого.

Я делал это на каждой странице, к которой я не хочу, чтобы пользователь имел доступ без входа в систему:

<f:view>
    <h:dataTable value="#{userHome.validuser()}"/>
     // my code
<f:view/>

Это вызовет функциюvaliduser() который находится в моем сеансе управляемых бобов.

Теперь это моя функция. Во время входа в систему я уже вставляю объект пользователя в сеанс.

public void validuser()
{
     FacesContext context = FacesContext.getCurrentInstance();
    UserLogin ul = (UserLogin) context.getExternalContext().getSessionMap().get("userbean");

     if (ul == null)
         try{
                context.getExternalContext().redirect("/HIBJSF/faces/LoginPage.xhtml");
                context.responseComplete();
        }
         catch (IOException e)
        {
         e.printStackTrace();
        }
} 

Если есть сеанс, но никто не вошел в систему, то вы попадете на страницу перенаправления.

Решение Вопроса

что вы должны использовать перенаправление taglib ядра JSTL, а не перенаправление jsp, чтобы это работало (так как срок действия jsp также истекает).

В вашемFacesConfig.xml вы положили следующее:

<error-page>
    <exception-type>javax.faces.application.ViewExpiredException</exception-type>
    <location>/sessionExpired.jsf</location>
</error-page>

sessionExpired.jsp:

<%@page contentType="text/html" pageEncoding="UTF-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

<c:redirect url="/login.jsf" />

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

<error-page>
    <error-code>400</error-code>
    <location>/400.html</location>
</error-page>

или элемент содержит полное имя класса типа исключения Java.

<error-page>
    <exception-type>javax.servlet.ServletException</exception-type>
    <location>/servlet/ErrorDisplay</location>
</error-page>

вы можете попробовать добавить это в ваш web.xml:

<context-param>
    <param-name>com.sun.faces.enableRestoreView11Compatibility</param-name> 
    <param-value>true</param-value>
</context-param>

Однако следует помнить, что это не всегда идеальное решение. Он скрывает тот факт, что пользователь потерял свой сеанс.

 13 нояб. 2013 г., 09:44
Это не лучшее решение.

ления

@Override
public void afterPhase(PhaseEvent event) {
    FacesContext facesContext = event.getFacesContext();
     if(facesContext.getViewRoot()==null){   
       try{   
           facesContext.getExternalContext().redirect(HOME_PAGE);   
           facesContext.responseComplete();   
       } catch (IOException e){   
           e.printStackTrace();   
       }   
     }
}

@Override
public void beforePhase(PhaseEvent event) {}

@Override
public PhaseId getPhaseId() {
    return PhaseId.RESTORE_VIEW;
}

зарегистрироваться в лица-config.xml

Ваш ответ на вопрос