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 :

[Servlets / AJAX] Gestion des variables de session qui expirent


Sujet :

Servlets/JSP Java

  1. #1
    Membre actif
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2007
    Messages
    500
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2007
    Messages : 500
    Points : 238
    Points
    238
    Par défaut [Servlets / AJAX] Gestion des variables de session qui expirent
    Hello,

    dans mon application web j'utilise Jquery et des servlets.

    J'ai ma première servlet "Login" dans laquelle , je me connecte à un Ldap, puis je charge une liste d'objets liés à mon utilisateur courant en session.

    Cette liste d'objet est utilisée dans d'autres servelts via un request.getSession().getAttribute("maListe").

    Cependant, comme ces servlets sont appelées via Ajax pour charger une partie de ma page, quand la session a expirée et que du coup "maListe" est null, j'ai une exception dans ma servlet et mon ajax ne renvoie rien.

    Y'a t-il un moyen, d'effectuer une vérification de la session et de certaines variables, et dans le cas où elles sont nulles, charger une page du style "http://..." ?

    A l'heure actuelle, avant tout traitement dans mes servlets, je fais appel à ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    	...	if(request.getSession(false) == null || maListe== null){
    			logger.debug("session expirée");
    			sessionCourante.invalidate();
    			request.getRequestDispatcher("/jsp/login.jsp").forward(request,	response);
     
    		}
    sauf que , ma page "login.jsp" est juste chargée dans l'endroit de la page que je charge via mon appel ajax, pas cool donc.

    Je pensais éventuellement à utiliser le setHeader ?
    L'intelligence c'est comme la confiture, moins tu en as , plus tu l'étales...

  2. #2
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 274
    Points : 4 166
    Points
    4 166
    Par défaut
    Tu peux effectivement utiliser un code Http de retour pour indiquer à ta page de te rediriger vers la page de connexion.
    Si tu utilises jQuery, tu peux regarder du côté de ajaxError : http://api.jquery.com/ajaxError/

  3. #3
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 310
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 310
    Points : 9 522
    Points
    9 522
    Billets dans le blog
    1
    Par défaut
    Personnellement, j'utilise plutôt un activateur de session cyclique via ajax et basé sur le temps de conservation de la session (fixé au plus bas).
    Du coup, la session n'expire jamais, sauf si l'utilisateur à quitté l'application.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  4. #4
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 274
    Points : 4 166
    Points
    4 166
    Par défaut
    Du coup c'est dommage, l'application ouverte mais non utilisée continue à utiliser des ressources côté serveur.

  5. #5
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 310
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 310
    Points : 9 522
    Points
    9 522
    Billets dans le blog
    1
    Par défaut
    Oui, mais si la fenêtre est ouverte, on peut considérer qu'elle est toujours active.
    La problématique est toujours la même :
    - on met un timeout long et du coup on garde des ressources inutiles longtemps quand l'utilisateur ferme sa fenêtre
    - on met un timeout très court mais on active périodiquement la session

    Les 2 solutions ont des avantages et des incovénients, nous, on a tranché pour le timeout super court
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #6
    Membre actif
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2007
    Messages
    500
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2007
    Messages : 500
    Points : 238
    Points
    238
    Par défaut
    Salut,

    tu aurais un exemple de ce style de gestion de session à tout hasard ? :p

    Pour le moment, je suis parti sur cette méthode :

    Dans ma servlet Login, je crée mes variables de session via
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    request.getSession().setAttribute("toto")
    Dans mes autres servlets, je controle ma session :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    		if(request.getSession(false) == null ||  request.getSession(false).getAttribute("listeObjects") == null){
    			logger.debug("session expirée");
    			response.setStatus(400);
    		}
    Et dans le ajax :
    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
    	$.ajaxSetup({
            error: function(data, error, errorThrown) {
     
    			if(data.status==400){
    					$("#dialog").text("Votre session a expirée.") ;
    					$( "#dialog" ).dialog({
    						modal: true,
    						buttons: {
    							Ok: function() {
    								$( this ).dialog( "close" );
    								$("li#deconnexion").click();
    							}
    						}
    					});
    			}else{
    				afficherDialogErreur(data.statusText);	
    			}
            }
        });
    Sinon, dans les servlets je récup mes variables de session via :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    request.getSession(false).getAttribute("toto");

    Ca semble plutot bien fonctionner pour l'instant.
    L'intelligence c'est comme la confiture, moins tu en as , plus tu l'étales...

  7. #7
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 274
    Points : 4 166
    Points
    4 166
    Par défaut
    Tu peux utiliser un filtre de servlet pour éviter de réécrire le test de session dans toutes tes servlets.

  8. #8
    Membre actif
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2007
    Messages
    500
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2007
    Messages : 500
    Points : 238
    Points
    238
    Par défaut
    Bah, toutes mes servlets héritent d'une servlet "Globale" , qui contient ma méthode qui vérifie le statut de la session, du coup, dans chaque servlet je fais juste appel à cette méthode.

    Après si cette manière de faire fonctionne pour la gestion des timeout, je passerai effectivement sur un filter.
    L'intelligence c'est comme la confiture, moins tu en as , plus tu l'étales...

  9. #9
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 310
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 310
    Points : 9 522
    Points
    9 522
    Billets dans le blog
    1
    Par défaut
    La servlet d'activation
    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 com...standard.servlet;
     
    import java.io.IOException;
    import java.io.PrintWriter;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;
    import com....util.misc.Utils;
     
    public class TimeoutSessionServlet extends HttpServlet
    {
        public static final long serialVersionUID = 1;
     
        @Override
        protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
        {
            HttpSession session = request.getSession();
            if (session.isNew())
            {
                System.out.println("Nouvelle session " + session.getId());
            }
            PrintWriter out = response.getWriter();
            response.setContentType("text/plain");
            out.write(Utils.escapeHtmlJavascript(session.getId()));
            out.flush();
        }    
    }
    Le web.xml
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    ...
        <servlet>
            <servlet-name>TimeoutSessionServlet</servlet-name>
            <servlet-class>com...standard.servlet.TimeoutSessionServlet</servlet-class>
        </servlet>
    ...
        <servlet-mapping>
            <servlet-name>TimeoutSessionServlet</servlet-name>
            <url-pattern>/timeoutSessionServlet</url-pattern>
        </servlet-mapping>
    Le script d'activation cyclique (utilise jQuery)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     
    /*
     * Activation de la session
     */
    function testTimeout()
    {
        $.ajax({
            url:"./timeoutSessionServlet",
            async: true,
            cache: false,
            success:function(text) { return; }
        });
    }
    Avec dans la page de template un appel sous cette forme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <script>
        setInterval("testTimeout()", 120000);
    </script>
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  10. #10
    Membre actif
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2007
    Messages
    500
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2007
    Messages : 500
    Points : 238
    Points
    238
    Par défaut
    Ok je vais regarder tout ça, merci
    L'intelligence c'est comme la confiture, moins tu en as , plus tu l'étales...

  11. #11
    Membre actif
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2007
    Messages
    500
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2007
    Messages : 500
    Points : 238
    Points
    238
    Par défaut
    J'ai au final un comportement étrange, dans ma servlet dans mon doPost j'ai quelque chose de ce style :

    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
     
     
    protected void doPost(HttpServletRequest request,
    		HttpServletResponse response) throws ServletException, IOException {
     
    		ArrayList<String> toCheck = new ArrayList<String>();
    		toCheck.add("listeSources");
    		verifierStatutSession(request, response,  toCheck);
    		monAutreMetode(request, response);
     
     
    }
     
    public void verifierStatutSession(HttpServletRequest request,
    		HttpServletResponse response, ArrayList<String> attributesToCheck) throws ServletException, IOException{
     
    	HttpSession sessionCourante = request.getSession(false);
    	boolean expired = false;
     
    	for(String attribute : attributesToCheck){
     
    		if(sessionCourante.getAttribute(attribute) == null)
    			expired = true;
    	}
     
    	if(expired){
    		logger.debug("session expirée");
    		response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
    		response.sendError(400);
    	}
     
    }
    Dans ma page, lorsque je clique sur un lien, je fais un appel Ajax qui selon l'action va dans telle ou telle méthode.


    En gros, avant d'essayer de choper des variables de session, je vérifie si elles ne sont pas nulles, si c'est le cas, je renvoie mon code erreur 400 qui est récupéré par Jquery qui affiche une popup puis redirige.

    Sauf que, j'ai beau avoir mon sendError qui se lance, j'ai aussi monAutreMetode(request, response); qui se lance juste après et qui du coup plante à cause d'un nullPointer mais en même temps, mon erreur est quand même bien récupérée dans mon jquery.
    L'intelligence c'est comme la confiture, moins tu en as , plus tu l'étales...

  12. #12
    Membre chevronné Avatar de jeffray03
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2008
    Messages
    1 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 501
    Points : 2 120
    Points
    2 120
    Par défaut
    salut,
    il suffirait donc de gerer cela dans une variable.
    du style:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    boolean status = verifierStatutSession(request, response,  toCheck);
    if(status)
    		monAutreMetode(request, response);
    mais cela serait mieux de gerer tout cela dans la partie metier et non dans le controleur.

    Eric

  13. #13
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 310
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 310
    Points : 9 522
    Points
    9 522
    Billets dans le blog
    1
    Par défaut
    Le comportement est normal, tu positionnes le code erreur dans ta réponse mais ça n'arrête pas le traitement pour autant.
    Tu devrais faire quelque chose comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    ...
    if (verifierStatutSession(request, response,  toCheck))
    {
        monAutreMethode(...);
    }
    ...
    ou alors balancer une exception dans ta méthode de contrôle
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

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

Discussions similaires

  1. Gestion des variables de Session
    Par mamady.kaba dans le forum Zend Framework
    Réponses: 0
    Dernier message: 25/11/2010, 12h41
  2. [MySQL] problème de gestion des variables de sessions (même navigateur)
    Par alaska750 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 24/08/2009, 17h59
  3. Gestion des variables de session
    Par Yoplaboum dans le forum Struts 1
    Réponses: 8
    Dernier message: 09/11/2007, 17h07
  4. gestion des Variables Sessions
    Par Landolsi dans le forum ASP.NET
    Réponses: 8
    Dernier message: 08/02/2007, 14h30
  5. Gestion des variables - mémoire ?
    Par RIVOLLET dans le forum Langage
    Réponses: 4
    Dernier message: 26/10/2002, 13h44

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