IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JSF Java Discussion :

JSF - Gestion de sessions


Sujet :

JSF Java

  1. #1
    Membre habitué Avatar de kimausoleil
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2004
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Février 2004
    Messages : 126
    Points : 135
    Points
    135
    Par défaut JSF - Gestion de sessions
    Bonjour !

    Tout neuf sur JSF (et JEE en général), je développe une application web où l'on a besoin d'être identifié pour accéder à son espace perso.

    J'ai donc des pages jsp qui communiquent avec un controlleur JSF tel que :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    @ManagedBean
    @SessionScoped
    public class ClientController extends AbstractController implements Serializable {
     
        @EJB
        private ClientFacadeLocal clientBean;
     
        private Client client = new Client();
     
    (...)

    Par ailleurs, mon controlleur lui même communique avec mon Stateless Bean lié à une ou plusieurs entités (JPA).

    Donc pas de problème pour se connecter, pas de problème pour se déconnecter.


    Mes soucis sont les suivants :
    1. si je suis connecté depuis trop longtemps à mon compte et que je recharge la page, j'ai alors perdu ma session. Comment détecter la perte de session, et rediriger vers ma page "login.jsp"
    2. si je ne suis pas connecté à mon compte et que je saisi l'URL directement, comment rediriger vers la page d'identification "login.jsp"


    Voilà.. je vois remercie d'avance !

  2. #2
    Membre régulier Avatar de juridakus
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Maroc

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2008
    Messages : 82
    Points : 115
    Points
    115
    Par défaut
    Un lien qui pourra peut être t'aider,
    http://blog.developpez.com/djo-mos/p...es-dans-jsf-r/

    Pratiquement moi je crée une interface que j'implémente dans chaque Bean. Elle est appellé dans mon implémentation du phaseListner, ainsi à chaque appel l'authentification est vérifiée sinon je fais une redirection vers la page de Login.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    if (!isLoginOk))
    	{
    		FacesContext fctx = FacesContext.getCurrentInstance();
    		ExternalContext ectx = fctx.getExternalContext();
    		String url = ((HttpServletRequest) ectx.getRequest())
    		.getContextPath()
    		+ "/pages/page_de_login.jsf";	
    		try {
    			ectx.redirect(url);
    		} catch (IOException e) {
     
    		e.printStackTrace();
    		}
    	}

  3. #3
    Membre habitué Avatar de kimausoleil
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2004
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Février 2004
    Messages : 126
    Points : 135
    Points
    135
    Par défaut
    Citation Envoyé par juridakus Voir le message
    Un lien qui pourra peut être t'aider,
    http://blog.developpez.com/djo-mos/p...es-dans-jsf-r/
    Ok, merci pour le lien !

    Donc si je résume ce que j'ai compris... il faut que mon controlleur implémente l'interface Filter, et je gère la méthode doFilter !

    C'est bien ça ?

  4. #4
    Membre habitué Avatar de kimausoleil
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2004
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Février 2004
    Messages : 126
    Points : 135
    Points
    135
    Par défaut
    J'ai pu enfin tester !
    Donc la méthode avec un filter dans le fichier web.xml marche bien .

    Citation Envoyé par juridakus Voir le message

    Pratiquement moi je crée une interface que j'implémente dans chaque Bean. Elle est appellé dans mon implémentation du phaseListner, ainsi à chaque appel l'authentification est vérifiée sinon je fais une redirection vers la page de Login.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    if (!isLoginOk))
    	{
    		FacesContext fctx = FacesContext.getCurrentInstance();
    		ExternalContext ectx = fctx.getExternalContext();
    		String url = ((HttpServletRequest) ectx.getRequest())
    		.getContextPath()
    		+ "/pages/page_de_login.jsf";	
    		try {
    			ectx.redirect(url);
    		} catch (IOException e) {
     
    		e.printStackTrace();
    		}
    	}
    C'est quoi ta méthode avec un "phase-listener" ?

    J'ai vu d'autres méthodes avec des "NavigationHandler" (???).

    En fait, c'est quoi la "bonne" méthode, ou plutôt quelle est la meilleur pratique ?


  5. #5
    Membre régulier Avatar de juridakus
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Maroc

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2008
    Messages : 82
    Points : 115
    Points
    115
    Par défaut
    Citation Envoyé par kimausoleil Voir le message
    J'ai pu enfin tester !
    Donc la méthode avec un filter dans le fichier web.xml marche bien .
    C'est quoi ta méthode avec un "phase-listener" ?
    J'ai vu d'autres méthodes avec des "NavigationHandler" (???).
    En fait, c'est quoi la "bonne" méthode, ou plutôt quelle est la meilleur pratique ?
    Content que tu ais pu tester quelque chose qui marche. je ne saurai te dire laquelle choisir pour les bests Practices. De mon coté j'ai fais un listener qui implémente l'interface Listener par défaut de JSF pour pouvoir entre autres mettre du code de vérification d'authentification entre les phases. C'est aussi utile pour le logging. Les méthodes avec les NavigationHandler moi aussi j'ai pas encore implémenté cela.

  6. #6
    Membre habitué Avatar de kimausoleil
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2004
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Février 2004
    Messages : 126
    Points : 135
    Points
    135
    Par défaut Dur, dur...
    Décidément je n'arrive pas vraiment à m'en sortir...

    En fait le filter gère bien la redirection si la session expire.

    Mais dans le cas où j'essaie d'accéder à une page sans m'être loggué avant, elle s'affiche quand même...

    Comment dois-je faire ?

  7. #7
    Membre régulier Avatar de juridakus
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Maroc

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2008
    Messages : 82
    Points : 115
    Points
    115
    Par défaut
    Si tu te débrouilles un peu en anglais voici un lien:
    http://www.jsfcentral.com/listings/A92000?link
    En fait c'est une implémentation du Listener comme je t'ai dis plus et dans l'afterPhase il teste que l'utilisateur n'est pas sur la page de login que la variable loggedIn du loginController est à false pour faire une redirection grâce au NavigationHandler vers la page de login via la règle "logout". c'est ok mais il y'a un bug qui survient si la session a expirée. Puisque tu gère l'expiration de la session déjà avec le filter. essaie donc d'implémenter ceci.
    Bonne chance

  8. #8
    Membre habitué Avatar de kimausoleil
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2004
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Février 2004
    Messages : 126
    Points : 135
    Points
    135
    Par défaut
    En adaptant un petit peu ça marche nickel !!!

    Je te remercie.

  9. #9
    Membre habitué Avatar de kimausoleil
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2004
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Février 2004
    Messages : 126
    Points : 135
    Points
    135
    Par défaut MA SOLUTION
    Comme j'ai reçu des solicitations en MP, je publie la solution que j'ai mise en place...

    1. Le phase listener pour rediriger vers une page d'identification si pas identifié :

      • Tout d'abord dans mon controller j'ai une variable qui m'indique si je me suis identifié :

        Code : Sélectionner tout - Visualiser dans une fenêtre à part
        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15
        16
        17
        18
        19
        20
        21
        22
        23
        24
        25
        26
        27
        28
        29
        30
        31
        32
        33
        34
        35
        36
        37
        38
        39
        40
        41
        42
        43
        44
        45
        46
        47
        48
        49
        50
        51
        52
        53
        54
        55
        56
        57
        58
        59
        60
        61
        62
        63
        64
        65
        66
        67
        68
        69
        70
        71
        72
        73
        74
        75
        76
        77
        78
        79
        80
        @ManagedBean
        @SessionScoped
        public class AccountController extends AbstractController implements Serializable {
        
        //=======================
        //=     Attributs
        //=======================
            @EJB
            private ClientFacadeLocal clientBean;
        
            private String login;
            private String password;
            private boolean isLogged = false;
        
            (...)
        
        //=================================
        //=        Constructeur
        //=================================
            /** Creates a new instance of AccountController */
            public AccountController() {
            }
        
        //==================================
        //=        METHODES PUBLIQUES
        //==================================
        
            //=================
            //=     COMPTE
            //=================
        
        
            /**
             * Connexion au compte client
             * @return
             */
            public String doConnect() {
        
                final String mname = "doConnect";
                String navigateTo = null;
        
                try {
                    client = clientBean.authenticate(login, password);
                    isLogged = true;
                    navigateTo = "client.infos";
                } catch (Exception e) {
                    addMessage(cname, mname, e);
                }
        
                return navigateTo;
            }
        
            /**
             * Déconnexion du compte client
             * @return
             */
            public String doDeconnect() {
        
                String navigateTo = "client.deconnect";
        
                FacesContext fc = FacesContext.getCurrentInstance();
                HttpSession session = (HttpSession) fc.getExternalContext().getSession(false);
        
                session.invalidate();
                isLogged = false;
        
                return navigateTo;
            }
        
        //=========================
        //=     ACCESSEURS
        //=========================
            public boolean getIsLogged() {
                return isLogged;
            }
        
            (...)
        
        }
      • Puis dans le phase listener, je teste si ma page n'est pas la page de login, et que c'est une page ".jsp" (sinon ça me filtrait les styles de mon fichier .css), et si je me suis connecté... sinon on redirige !


      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      35
      36
      37
      38
      39
      40
      public class LoggerTest implements PhaseListener {
      
          @Override
          public void afterPhase(PhaseEvent event) {
      
              //  pour logguer
              FacesContext fc = FacesContext.getCurrentInstance();
      //        fc.getExternalContext().log("AFTER - " + event.getPhaseId() + " / " + fc.getViewRoot().getViewId());
              
              boolean loginPage = (fc.getViewRoot().getViewId().indexOf("login.jsp") > -1);
              boolean jsppage = (fc.getViewRoot().getViewId().indexOf(".jsp") > -1);
              if (!loginPage && jsppage) {
      
                  boolean isLogged = false;
                  try {
                      AccountController account = (AccountController) fc.getExternalContext().getSessionMap().get("accountController");
                      isLogged = account.getIsLogged();
                  } catch (Exception e) {
                  }
                  if (!isLogged) {
                      NavigationHandler nh = fc.getApplication().getNavigationHandler();
                      nh.handleNavigation(fc, null, "client.deconnect");
                  }
                  
              }
          }
      
          @Override
          public void beforePhase(PhaseEvent event) {
              //  pour logguer
      //        FacesContext fc = FacesContext.getCurrentInstance();
      //        fc.getExternalContext().log("BEFORE - " + event.getPhaseId());
          }
      
          @Override
          public PhaseId getPhaseId() {
              return PhaseId.RESTORE_VIEW;    //on ne s'occupe que des vues finales
          }
      }
      Puis dans le fichier faces-config.xml :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
       
      <!-- le phase listener-->
      <lifecycle>
              <phase-listener>util.LoggerTest</phase-listener>
      </lifecycle>
      <!-- la navigation pour la déconexion (et la redirection) -->
      <navigation-rule>
              <from-view-id>*</from-view-id>
              <navigation-case>
                  <from-outcome>client.deconnect</from-outcome>
                  <to-view-id>/login.jsp</to-view-id>
                  <redirect/>
              </navigation-case>
          </navigation-rule>
    2. La session expirée gérée par mon web.xml :
      Finalement, au lieu de passer par un filter, on va "catcher" l'erreur générée lorqu'il y a perte de session pour rediriger également vers la page de login !
      Dans web.xml :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
       
      <error-page>
              <exception-type>javax.faces.application.ViewExpiredException</exception-type>
              <location>/faces/login.jsp</location>
      </error-page>


    Voilà ! Et ça marche très très bien...

    Pour tester l'expiration de page, vous pouvez changer dans le fichier web.xml la valeur 30 (minutes) par 1 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <session-config>
            <session-timeout>1</session-timeout>
        </session-config>
    J'espère qu'avec ça, d'autres ne galèreront pas autant que moi

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [JSF] Durée des sessions
    Par bslota dans le forum JSF
    Réponses: 1
    Dernier message: 18/01/2006, 10h04
  2. [tomcat] gestion des sessions
    Par sebos63 dans le forum Tomcat et TomEE
    Réponses: 2
    Dernier message: 12/10/2004, 14h25
  3. [Struts] Gestion de session
    Par Nuncyco dans le forum Struts 1
    Réponses: 3
    Dernier message: 24/06/2004, 11h11
  4. [ STRUTS ] [ SESSION ] Pb gestion de sessions
    Par LoulouFifi dans le forum Struts 1
    Réponses: 4
    Dernier message: 30/03/2004, 16h38
  5. [JSP] Gestion de sessions
    Par orisis dans le forum Servlets/JSP
    Réponses: 6
    Dernier message: 30/03/2004, 15h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo