Frage

Ok einfache Frage. Ich habe eine JSF-Anwendung, eine Login-Seite enthält. Das Problem ist, wenn der Benutzer die Login-Seite lädt, lässt es für eine Weile, dann versucht die Sitzung anmelden abläuft und ein ViewExpiredException geworfen wird. Ich konnte auf die Login-Umleitung zurück, wenn dies geschieht, aber das ist nicht sehr glatt. Wie kann ich erlaube dieser Strömung richtig ohne einen zusätzlichen Versuch einzuloggen?

War es hilfreich?

Lösung

Aktualisieren

Ab Mojarra 2.1.19 / 2.2.0 Sie jetzt das Einschwingverhalten Attribut des <f:view> auf true gesetzt werden:

<f:view transient="true">
     Your regular content
</f:view>

Sie können über in auf Balusc des Blog hier lesen:

http://balusc.blogspot.com.br/2013 /02/stateless-jsf.html

Original

Wenn Sie Facelets verwenden Sie können Ihre eigenen Viewhandler erstellen, dies zu umgehen:

public class LoginViewHandler extends FaceletViewHandler
{
    public LoginViewHandler( ViewHandler viewHandler )
    {
        super( viewHandler );
    }

    @Override
    public UIViewRoot restoreView( FacesContext ctx, String viewId )
    {
        UIViewRoot viewRoot = super.restoreView( ctx, viewId );

        if ( viewRoot == null && viewId.equals( "/login.xhtml" ) )
        {
            // Work around Facelet issue
            initialize( ctx );

            viewRoot = super.createView( ctx, viewId );
            ctx.setViewRoot( viewRoot );

            try
            {
                buildView( ctx, viewRoot );
            }
            catch ( IOException e )
            {
                log.log( Level.SEVERE, "Error building view", e ); 
            }
        }

        return viewRoot;
    }
}

Ändern "/login.xhtml", um Ihre Login-Seite. Diese prüft, ob es Ihre Ansicht wiederherstellen kann, und wenn es nicht kann und die aktuelle Ansicht ist Ihre Login-Seite wird es schaffen und den Blick für Sie bauen.

Setzen Sie diese in Ihrem Gesicht-config.xml wie folgt:

<application>
    <!-- snip -->
    <view-handler>my.package.LoginViewHandler</view-handler>
</application>

Wenn Sie JSF ohne Facelets verwenden (das heißt JSPs) Sie können versuchen, die Klasse mit ViewHandlerWrapper verlängern - beachten Sie, dass buildView () nicht zur Verfügung stehen. Hoffentlich create () auf seine eigenen wird die Ansicht korrekt eingestellt, aber ich bin nicht 100% sicher mit JSF / JSP.

Andere Tipps

Es klingt wie Ihre Login-Seite in Sitzungsbereich ist, wenn es nicht wirklich braucht. Anfrag Umfang sollte für eine Login-Seite in Ordnung sein (da realistisch sollte es nichts in der Sitzung vor dem Benutzer anmeldet sein). Sobald der Benutzer anmeldet, können Sie dieses Problem auftauchen haben zurück, aber Phill Ideen sind sehr gut von dort weiter.

Mit jsp Sie die Sitzung für eine Seite mit dieser Richtlinie <%@ page session="false" %> deaktivieren. Es muss etwas ähnliches für JSF sein.

Ein paar leicht Hacky Lösungen:

  • (Very Hacky) einen <meta http-equiv="refresh" content="5"/>-Tag verwenden, um automatisch alle so oft die Seite neu.
  • Verwenden Sie eine JavaScript-Funktion in regelmäßigen Abständen eine ‚Ping‘ Anfrage an den Server zu senden, um die Sitzung am Leben zu halten.

Wir verwenden IceFaces bei der Arbeit, die automatisch erkennt, wenn Ihre Sitzung ist abgelaufen, und zeigt ein Pop-up Sie alarmieren zu der Tatsache. Aber wir manchmal noch aus irgendeinem Grund Probleme auf der Login-Seite haben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top