Question

Ok, question simple. J'ai une application JSF contenant une page de connexion. Le problème est que si l'utilisateur charge la page de connexion, la laisse pendant un moment, puis tente de se connecter, la session expire et une exception ViewExpiredException est levée. Je pourrais rediriger à la connexion lorsque cela se produit, mais ce n'est pas très lisse. Comment permettre à ce flux de se connecter correctement sans autre tentative?

Était-ce utile?

La solution

Mettre à jour

À partir de Mojarra 2.1.19 / 2.2.0, vous pouvez maintenant définir l'attribut transitoire de <f:view> sur true:

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

Vous pouvez en savoir plus sur le blog de Balusc ici:

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

Original

Si vous utilisez Facelets, vous pouvez créer votre propre ViewHandler pour gérer cela:

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

Modifier " /login.xhtml " sur votre page de connexion. Cela permet de vérifier s'il peut restaurer votre vue. S'il ne le peut pas et si la vue actuelle est votre page de connexion, elle sera créée et construite pour vous.

Définissez ceci dans votre fichier face-config.xml comme suit:

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

Si vous utilisez JSF sans Facelets (c'est-à-dire des JSP), vous pouvez essayer d'étendre la classe avec ViewHandlerWrapper - notez que buildView () ne sera pas disponible. Espérons que createView () seule configurera correctement la vue, mais je ne suis pas tout à fait sûr avec JSF / JSP.

Autres conseils

Il semble que votre page de connexion se trouve dans la portée de la session, alors que ce n’est vraiment pas nécessaire. La portée de la requête devrait convenir à une page de connexion (puisque, de manière réaliste, il ne devrait y avoir rien dans la session avant que l'utilisateur ne se connecte). Une fois l’utilisateur connecté, vous pourrez peut-être résoudre ce problème, mais les idées de Phill sont très bonnes à partir de ce moment-là.

Avec jsp, vous pouvez désactiver la session pour une page contenant cette directive <%@ page session="false" %>. Il doit y avoir quelque chose de similaire pour jsf.

Quelques solutions légèrement hacky:

  • (Very hacky) utilisez une balise <meta http-equiv="refresh" content="5"/> pour recharger automatiquement la page de temps en temps.
  • Utilisez une fonction JavaScript pour envoyer périodiquement une demande "ping" au serveur afin que la session reste active.

Nous utilisons IceFaces au travail, qui détecte automatiquement l'expiration de votre session et affiche une fenêtre contextuelle vous alertant. au fait. Cependant, nous avons parfois des problèmes sur la page de connexion pour une raison quelconque.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top