wake-up-neo.net

Behandlung von 'Sitzung abgelaufen' in JSF-Webanwendung, die in JBoss AS 5 ausgeführt wird

Diese Frage steht im Zusammenhang mit meiner anderen Frage " Wie kann ich zur Anmeldeseite umleiten, wenn die Sitzung in der Java-Webanwendung abgelaufen ist? ". Ich versuche Folgendes zu tun:

  1. Ich habe eine JSF-Webanwendung, die auf JBoss AS 5 ausgeführt wird
  2. Wenn der Benutzer beispielsweise 15 Minuten lang inaktiv ist, muss ich ihn abmelden und auf die Anmeldeseite umleiten, wenn er versucht, die Anwendung nach Ablauf der Sitzung zu verwenden.
  3. Also habe ich, wie in ' JSF Logout and Redirect ' vorgeschlagen, einen Filter implementiert, der nach abgelaufenen Sitzungsbedingungen sucht und den Benutzer zu einer session-timed-out.jsp-Seite umleitet, wenn die Sitzung abgelaufen ist.
  4. Ich habe SessionExpiryCheckFilter vor allen anderen Filterdefinitionen in web.xml hinzugefügt, damit meine Sitzungsablaufprüfung immer den ersten Treffer erhält.

Jetzt kommt die Herausforderung, vor der ich stehe . Da ich JBoss AS verwende, leitet mich JBoss nach Ablauf der Sitzung automatisch zur Anmeldeseite weiter (beachten Sie, dass der Filter für die Sitzungsablaufprüfung nicht aktiviert ist). Nachdem ich mich angemeldet habe, fängt mein SessionExpiryCheckFilter die Anforderung ab und stellt fest, dass eine Sitzung verfügbar ist. Aber es wirft die Ausnahme javax.faces.application.ViewExpiredException: viewId:/mypage.faces - View /mypage.faces could not be restored.

Hat sich schon jemand mit diesem Problem befasst? Irgendwelche Ideen, um dieses Problem zu lösen?

18
Veera

Der folgende Ansatz funktioniert für mich. Beachten Sie, dass Sie die JSTL-Core-TagLib-Umleitung und nicht die JSP-Umleitung verwenden müssen, damit dies funktioniert (da die JSP ebenfalls abläuft).

In Ihrer FacesConfig.xml haben Sie Folgendes eingetragen:

<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" />

Sie können diesen Ansatz auch für andere Fehlertypen oder Ausnahmen verwenden. Das Element enthält beispielsweise eine Zuordnung zwischen einem Fehlercode oder Ausnahmetyp und dem Pfad einer Ressource in der Webanwendung:

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

oder Element enthält einen vollständig qualifizierten Klassennamen eines Java-Ausnahmetyps.

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

Wenn Sie Mojarra/Sun RI verwenden, möchten Sie möglicherweise Folgendes zu Ihrer web.xml hinzufügen:

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

Beachten Sie jedoch, dass dies nicht immer die perfekte Lösung ist. Es verbirgt die Tatsache, dass der Benutzer seine Sitzung verloren hat.

3
skytteren

Implementieren Sie javax.faces.event.PhaseListener für die Wiederherstellungsansicht

@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;
}

registriere dich in faces-config.xml

1
keith

Ich habe versucht, einen Filter dafür zu schreiben, aber ein bisschen, wie es bei mir nicht funktioniert hat, also habe ich eine Alternative dafür gemacht.

Ich habe es auf jeder Seite so gemacht, auf die der Benutzer ohne Login nicht zugreifen soll:

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

Dies ruft die Funktion validuser() auf, die sich in meiner Session Managed Bean befindet.

Das ist meine Aufgabe. Während der Anmeldung füge ich das Benutzerobjekt bereits in die Sitzung ein.

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();
        }
} 

Wenn es eine Sitzung gibt, sich aber niemand angemeldet hat, werden Sie zu einer Umleitungsseite weitergeleitet.

0
ifti

Ich würde vorschlagen, einen Sitzungslistener in Verbindung mit dem Filter zu schreiben.

Nach Ablauf der Sitzung können Sie ein neues Sitzungsobjekt erstellen und für das neue Objekt ein Zeitlimit festlegen.

Überprüfen Sie einfach den Timeout-Wert im Filter und leiten Sie den Browser weiter.

Siehe http://www.Java2s.com/Code/Java/Servlets/Servletsessionlistener.htm

0
Koekiebox