2008-10-23 12 views
4

question simple, Ok. J'ai une application JSF, contenant une page de connexion. Le problème est que si l'utilisateur charge la page de connexion, la quitte pendant un certain temps, puis tente de se connecter à la session expire et une exception ViewExpiredException est levée. Je pourrais rediriger vers la connexion quand cela se produira, mais ce n'est pas très facile. Comment puis-je autoriser ce flux à se connecter correctement sans tentative supplémentaire?temps de connexion sur JSF

Répondre

6

Mise à jour

Au Mojarra 2.1.19/2.2.0 vous pouvez maintenant définir l'attribut transitoire de la <f:view> true:

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

Vous pouvez lire dans le Balusc's blog ici :

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

originale

Si vous utilisez Facelets vous pouvez créer votre propre ViewHandler gérer ceci:

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

Change "/login.xhtml" à votre page de connexion. Cela vérifie si elle peut restaurer votre vue, et si elle ne peut pas et la vue actuelle est votre page de connexion, il va créer et créer la vue pour vous.

Set dans votre face-config.xml comme suit:

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

Si vous utilisez JSF sans Facelets (c.-à-JSPs), vous pouvez essayer d'avoir la classe étendre ViewHandlerWrapper - noter que buildView() sera ne pas être disponible Heureusement, createView() en lui-même va régler la vue correctement, mais je ne suis pas sûr à 100% avec JSF/JSP.

+0

Toute idée comment faire cela dans JSF 2? –

0

Couple de solutions légèrement aki:

  • (Très 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 requête « ping » au serveur pour garder la session en vie.

Nous utilisons IceFaces au travail qui détecte automatiquement quand votre session a expiré et affiche un pop-up vous alertant sur le fait. Mais nous avons encore parfois des problèmes sur la page de connexion pour une raison quelconque.

0

Il semble que votre page de connexion est portée de la session, quand il n'a pas vraiment besoin d'être. La portée de la requête devrait convenir à une page de connexion (puisque, de manière réaliste, il ne devrait pas y avoir de session en cours avant que l'utilisateur ne se connecte). Une fois que l'utilisateur se connecte, vous avez peut-être recopié ce problème, mais les idées de Phill sont très bonnes à partir de là.

0

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