Umgang mit ViewExpiredException auf der login-Seite mit einem benutzerdefinierten ViewHandler
In meiner web-app, wenn die session abläuft und der Benutzer initiiert eine Anfrage (ganze Seite oder AJAX), wird der Benutzer weitergeleitet auf die login-Seite mit einer Meldung, dass die Sitzung abgelaufen ist. Das problem ist, wenn die login-Seite wird offen gelassen lange genug für die session abläuft und der Benutzer versucht, sich anzumelden, wird der Benutzer weitergeleitet auf die login-Seite mit einer Meldung, dass die Sitzung abgelaufen ist.
Stieß ich auf diese Lösung, aber es ist für JSF 1.x und funktioniert nicht mit JSF 2. So begann ich mit dem Aufbau meiner eigenen:
public class LoginViewHandler extends ViewHandler
{
public LoginViewHandler(ViewHandler parent)
{
this.parent = parent;
}
@Override
public Locale calculateLocale(FacesContext context)
{
return parent.calculateLocale(context);
}
@Override
public String calculateRenderKitId(FacesContext context)
{
return parent.calculateRenderKitId(context);
}
@Override
public UIViewRoot createView(FacesContext context, String viewId)
{
return parent.createView(context, viewId);
}
@Override
public String getActionURL(FacesContext context, String viewId)
{
return parent.getActionURL(context, viewId);
}
@Override
public String getResourceURL(FacesContext context, String path)
{
return parent.getResourceURL(context, path);
}
@Override
public void renderView(FacesContext context, UIViewRoot viewToRender)
throws IOException, FacesException
{
parent.renderView(context, viewToRender);
}
@Override
public UIViewRoot restoreView(FacesContext context, String viewId)
{
UIViewRoot viewRoot = parent.restoreView(context, viewId);
if (viewRoot == null && viewId.equals("/login.xhtml"))
{
parent.initView(context);
viewRoot = parent.createView(context, viewId);
context.setViewRoot(viewRoot);
try
{
buildView(context, viewRoot); //Compile error!
}
catch (IOException e)
{
log.log(Level.SEVERE, "Error building view", e);
}
}
return viewRoot;
}
@Override
public void writeState(FacesContext context) throws IOException
{
parent.writeState(context);
}
private ViewHandler parent;
}
Allerdings gibt es keine Methode namens buildView
. Ich bin mir nicht sicher, was es tut, warum es gebraucht wird und was sollte ich ersetzen Sie es mit. Irgendwelche Ideen?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es wurde verschoben, um die
ViewDeclarationLanguage#buildView()
, da dieser Schritt entkoppelt ist aus der Sicht der angewandten Technologie (mit Facelets, JSP, JavaVDL, was auch immer).Es ist übrigens einfacher zu erweitern
ViewHandlerWrapper
statt. Auf diese Weise brauchen Sie nicht, die Reihe von delegate-Methoden.