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:
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?
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>
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.
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
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.
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