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?

InformationsquelleAutor Distortum | 2012-08-21
Schreibe einen Kommentar