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

Servlets/JSP Java Discussion :

HttpServlet, Session & TimeOut


Sujet :

Servlets/JSP Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 8
    Par défaut HttpServlet, Session & TimeOut
    Bonjour,

    Je travaille sur une application java qui appelle des HttpServlet sur un serveur Tomcat.

    J'ai mis en place dans le fichier Xml:
    • un TimeOut (que j'ai baissé à 3 minutes pour mes tests)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <session-config>
    	<session-timeout>3</session-timeout>
    </session-config>
    • un listener sur les attributs de la session

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <listener>
    	<listener-class>
    		fr.meteo.servlet.auth.SessionAttribute
    	</listener-class>
    </listener>
    Enfin j'ai une classe qui s'occupe de déconnecter mon utilisateur si la session est trop longtemps innactive
    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
    package fr.meteo.servlet.auth;
     
    import javax.servlet.http.HttpSessionAttributeListener;
    import javax.servlet.http.HttpSessionBindingEvent;
     
    /**
     * Classe SessionAttribute
     */
    public class SessionAttribute implements HttpSessionAttributeListener{
     
    	public void attributeAdded(HttpSessionBindingEvent event) {
    		// TODO Auto-generated method stub
    	}
     
    	@Override
    	/**
    	 * Définition : Méthode permettant de gerer la déconnection
    	 */
    	public void attributeRemoved(HttpSessionBindingEvent event) {
    		if (event.getName().equals("Login")){
    			DeconnectionServeur.deconnection((String)event.getValue());	
    		}
    	}
     
    	@Override
    	public void attributeReplaced(HttpSessionBindingEvent arg0) {
    		// TODO Auto-generated method stub
     
    	}
    }
    Mon problème :
    Bien que j'appelle différents services au cours de ces 3 minutes, le serveur me déconnecte automatiquement 3 minutes (environ) après que l'utilisateur se soit connecté.

    Donc la question est :
    Comment faire comprendre au serveur que la session est solicitée et donc toujours en activité ?

    Je pensais régler le problème en mettant le code suivant dans mes servlets mais ce n'est pas la bonne solution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    String ip = request.getRemoteAddr();
    HttpSession session = request.getSession();
    session.setAttribute("Ip", ip);
    session.setAttribute("Login", login);
    (Mon idée était de créer de l'activité sur la session)

    Mon raisonnement n'est pas le bon mais je ne vois pas quoi corriger ...

    Merci pour votre aide

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 8
    Par défaut
    Bonjour,
    J'ai trouvé la solution donc je vous la met au cas ou ...
    Si quelqu'un pouvait valider cette conception, ça serait sympa !

    Côté serveur :
    Mise en place d’un listener de session en plus du paramètre Session-Timeout

    web.xml
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <listener>
         <description>sessionListener</description>
         <listener-class>
              fr.meteo.servlet.auth.SessionListener
         </listener-class>
    </listener>
     
    <session-config>
         <session-timeout>30</session-timeout>
    </session-config>
    SessionListener
    Classe SessionListener
    Classe permettant la récupération de l’évenement de destruction de session qui induit un appel à la fonction de déconnection() de la classe DeconnectionServeur
    (Plus suivi du nombre de session active avec un int sessionCount)
    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
    package fr.meteo.servlet.auth;
     
    import javax.servlet.http.HttpSessionEvent;
    import javax.servlet.http.HttpSessionListener;
     
    public class SessionListener implements HttpSessionListener {
        private int sessionCount = 0;
     
        public void sessionCreated(HttpSessionEvent event) {
            synchronized (this) {
                sessionCount++;
            }
     
    //        System.out.println("Création de la session: " + event.getSession().getId());
    //        System.out.println("Nombre de Sessions: " + sessionCount);
     
        }
     
        public void sessionDestroyed(HttpSessionEvent event) {
            synchronized (this) {
                sessionCount--;
            }
     
    		if (event.getSession().getAttribute("Login") != null){
    			DeconnectionServeur.deconnection((String)event.getSession().getAttribute("Login"));	
    		}
     
    //        System.out.println("Suppresion de la session : " + event.getSession().getId());
    //        System.out.println("Nombre de Sessions: " + sessionCount);
        }
    }
    Gestion des Sessions
    Création de la session avec la servlet de validation de connexion
    /* Création de la Session */
    HttpSession session = request.getSession(true);
    session.setAttribute("Login", login);

    Suppression de la session avec la servlet de déconnexion
    HttpSession session = request.getSession(false);
    session.invalidate();

    Mise a jour de la session pour les autres servlets
    HttpSession session = request.getSession(false);

    Côté client :
    Récupération de l’id de la session lors de la validation de la connexion d’un user(comportement d’un cookie)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    String cookieVal = connection.getHeaderField("Set-Cookie");
    if(cookieVal != null) {
    sessionId = cookieVal.substring(0, cookieVal.indexOf(";"));
    }
    Insertion de l’id sous forme d’un cookie à chaque appel de servlet
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    connection.setRequestProperty("Cookie", sessionId);

  3. #3
    Membre Expert
    Avatar de fxrobin
    Homme Profil pro
    Architecte SI, Java Fan, API Manager
    Inscrit en
    Novembre 2007
    Messages
    875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Architecte SI, Java Fan, API Manager
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2007
    Messages : 875
    Par défaut
    Bonjour, il y a quand même quelque chose qui m'échappe.

    Normalement, même avec un Listener de session, ta session est maintenue tant qu'il y a de l'activité dessus .... pas besoin de gérer "manuellement" cette activité, c'est un peu étrange.

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 8
    Par défaut
    En fait - sauf erreur de ma part - le comportement était bon côté navigateur mais pas du côté client lourd.

    Sans le cookie qui fournit le SessionId, il y avait autant de session que d'appels aux servlets.
    Et sans le :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    HttpSession session = request.getSession(false);
    La session se fermée à la fin du timeOut sans avoir réinitialisé le compteur.

    Mais c'est parce que je ne suis pas sur de mon implémentation que je demandais si quelqu'un pouvait confirmer
    Je suis peut être passé à côté de quelque chose ...

  5. #5
    Membre Expert
    Avatar de fxrobin
    Homme Profil pro
    Architecte SI, Java Fan, API Manager
    Inscrit en
    Novembre 2007
    Messages
    875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Architecte SI, Java Fan, API Manager
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2007
    Messages : 875
    Par défaut
    ah oui désolé, j'avais pas compris que c'était une application "client lourd".

    J'avais eu le même soucis avec une applet qui discutait avec une servlet en XML, je passais alors le jsessionid dans l'url d'appel de la servlet, comme ça le serveur d'app retrouvait ses billes.

    A+

  6. #6
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Oui, tu dois faire suivre le jsessionid de page en page sinon le serveur te crée une nouvelle session à chaque fois. Préserver les cookies ne suffit pas.

Discussions similaires

  1. [Debutant(e)]Timeout de session et redirection page acceuil
    Par xhercule dans le forum Servlets/JSP
    Réponses: 11
    Dernier message: 26/12/2007, 11h23
  2. session idle => timeout
    Par noumian dans le forum Langage
    Réponses: 2
    Dernier message: 21/12/2007, 09h21
  3. [SOAP / PHP] Sessions et Timeout
    Par Geomaster dans le forum XML/XSL et SOAP
    Réponses: 1
    Dernier message: 09/12/2005, 09h54
  4. Alter Session : question de TimeOut
    Par Filippo dans le forum Administration
    Réponses: 4
    Dernier message: 13/05/2004, 17h42
  5. [JSP]recuperer session-timeout dans web.xml
    Par seb_fou dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 07/05/2004, 16h01

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