Domanda

Ok semplice domanda. Ho un'applicazione JSF, contenente una pagina di accesso. Il problema è se l'utente carica la pagina di accesso, la lascia per un po ', quindi tenta di accedere e la sessione scade e viene generata una ViewExpiredException. Potrei reindirizzare nuovamente al login quando questo accade, ma non è molto fluido. Come posso consentire a questo flusso di accedere correttamente senza un ulteriore tentativo?

È stato utile?

Soluzione

Aggiorna

A partire da Mojarra 2.1.19 / 2.2.0 ora puoi impostare l'attributo transitorio di <f:view> su true:

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

Puoi leggere in blog di Balusc qui:

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

Original

Se stai usando Facelets puoi creare il tuo ViewHandler per gestirlo:

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

Modifica " /login.xhtml " alla tua pagina di accesso. Questo verifica se è in grado di ripristinare la vista e, se non è possibile e la vista corrente è la pagina di accesso, creerà e costruirà la vista per te.

Impostalo nel tuo face-config.xml come segue:

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

Se stai usando JSF senza Facelets (cioè JSP) puoi provare a far estendere la classe ViewHandlerWrapper - nota che buildView () non sarà disponibile. Spero che createView () da solo imposti correttamente la vista ma non sono sicuro al 100% con JSF / JSP.

Altri suggerimenti

Sembra che la tua pagina di accesso sia nell'ambito della sessione, quando davvero non è necessario. L'ambito della richiesta dovrebbe andare bene per una pagina di accesso (poiché, realisticamente, non dovrebbe esserci nulla in sessione prima che l'utente acceda). Una volta che l'utente accede, è possibile che questo problema venga ripristinato, ma le idee di Phill sono molto valide da lì in poi.

Con jsp puoi disabilitare la sessione per una pagina che include questa direttiva <%@ page session="false" %>. Ci deve essere qualcosa di simile per jsf.

Coppia di soluzioni leggermente confuse:

  • (Molto caotico) usa un tag <meta http-equiv="refresh" content="5"/> per ricaricare automaticamente la pagina ogni tanto.
  • Utilizzare una funzione JavaScript per inviare periodicamente una richiesta di "ping" al server per mantenere attiva la sessione.

Utilizziamo IceFaces al lavoro che rileva automaticamente quando la sessione è scaduta e visualizza un pop-up che avvisa l'utente al fatto. Ma a volte abbiamo ancora problemi sulla pagina di accesso per qualche motivo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top