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 :

Détruire proprement la session et les variables existantes


Sujet :

Servlets/JSP Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    349
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 349
    Par défaut Détruire proprement la session et les variables existantes
    Bonjour,

    Je débute en JSP et voulais savoir comment détruire proprement une session.

    Ci-dessous la façon dont je l'initialise (après la requête)
    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
        ConnectionDB db = new ConnectionDB();
        db.connect();
     
        Vector v = db.requete_query("SELECT * FROM UTILISATEUR WHERE LOGIN='"+login+"' AND PASSWD='"+passwd+"'");
     
        String req="SELECT * FROM UTILISATEUR WHERE LOGIN='"+login+"' AND PASSWD='"+passwd+"'";
     
        for(int i=0;i<v.size();i++){
            String lid =""+((HashMap)v.get(i)).get("ID");
             String log=""+((HashMap)v.get(i)).get("LOGIN");
             String droit=""+((HashMap)v.get(i)).get("DROIT");
            user.clear();
           user.add(lid);
           user.add(log);
       }
       db.close();
    Je passe ma session de page en page grâce à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <jsp:useBean id="user" class="java.util.ArrayList" scope="session" />
    Dernier point, comment tester si une session existe ?

    Merci d'avance pour votre aide.

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    383
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 383
    Par défaut
    Je ne vois pas où tu mets ton ArrayList en session (dans ta servlet).

    Il faut faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    List maListe = new ArrayList();
    maListe.add("uneValeur");
     
    ...
     
    // Recupere la session
    HttpSession session = request.getSession(true);
     
    // met l'ArrayList en session
    session.setAttribute("user", maListe);
    Le fait de passer la valeur true à getSession(true) veut dire que si la session n'existe pas, alors elle est créé.

    Le mieux c'est de laisser la session expirer toute seule mais si tu veux la détruire tu peux faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    session.invalidate();

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    349
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 349
    Par défaut
    Houla ca se corse pour moi ^^

    Je veux pouvoir détruire la session comme quand on clique sur "Déconnexion".
    Mon application doit pouvoir permettre à un utilisateur de s'authentifier sous différents noms pour avoir différents droits. Tu me suis ?

    hpl76

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    383
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 383
    Par défaut
    Oui c'est ça, dans la servlet deconnexion tu fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    HttpSession session = request.getSession(true);
    session.invalidate();

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

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Billets dans le blog
    1
    Par défaut
    Pour tester si une session n'existe pas, il faut faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if ( request.getSession(false) == null )
    {
       // ... là, elle n'existe pas
    }
    Si tu fais request.getSession(true), tu demandes "donne moi la session courante et si elle n'existe pas, créé la"
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    349
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 349
    Par défaut
    Tu m'as devancé ^^

    C'est cool de tomber sur des gens comme toi. Perso ca m'encourage à vouloir apprendre. En revanche moi j'avais ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <jsp:useBean id="user" class="java.util.ArrayList" scope="session" />
     
    <% /* check for login */ 
    if(user.isEmpty()){ 
        out.println("Que fais-tu ici ?");
    }else{
        session.invalidate();
    }
    response.sendRedirect ("index.jsp");
    %>
    Le truc c'est que ca marche en partie. Je m'explique, ma session est à demi-morte. Quand je vais sur une page que j'ai déjà visité malgré la destruction de ma session, j'y ai quand même accès malgré le check user.isEmpty, bizarre non ? Comme ci la page était gardé dans le cache (en fait c'est quasi le cas)

    Une idée ?

    Amicalement,

    hpl76

    Ps : je vais essayer avec ton code également merci

  7. #7
    Membre chevronné Avatar de T`lash
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Saint-Pierre-Et-Miq.

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Septembre 2007
    Messages : 381
    Par défaut
    Petit à propos au passage : évite à tout prix d'utiliser la classe Vector qui est un reliquat des premières versions du langage et qui pourrait disparaitre du jour au lendemain (même si en général les classes dépréciées restent là à alourdir le JRE).
    Utilise plutôt ArrayList ou autre selon le cas.

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

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Billets dans le blog
    1
    Par défaut
    Pour "annuler" une session, c'est effectivement session.invalidate() qui répond au besoin.

    Dans certains cas, si par exemple tu testes systématiquement (à chaque request) la présence d'un objet particulier (comme par exemple "user"), tu pourrais te contenter de retirer cet objet de la session par session.remove("user");

    A+
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    349
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 349
    Par défaut
    Merci mais...

    1 - si ma variable de session user est détruite comment se fait il que le système me raffiche bonjour hpl76, déconnectez-vous ? C'est le cas malgré le passage par destroy et malgré le check en haut de page :'(

    2 - Je dois l'interpréter comment cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (request.getSession(false) != null ) {
    J'essaie désespéremment de trouver le moyen de dire : "si variable session user existe alors"...je commence à fatiguer lol.

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

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Billets dans le blog
    1
    Par défaut
    Essaye plutôt cette forme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <jsp:useBean id="user" type="java.util.ArrayList" scope="session" />
    
    <% 
    if (user == null)
    {
        response.sendRedirect ("index.jsp");
    }
    else
    {
        ...
    %>
    Après un session.invalidate(), tu seras dans le cas user == null

    Maintenant, tu pourrais également passer par un filtre pour faire ce test plutôt que de le mettre dans toutes tes pages.
    (mais on verra ça plus tard peut-être )
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  11. #11
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    349
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 349
    Par défaut
    Bonjour,

    Désolé de ne donner que des news maintenant mais j'étais en déplacement .

    Bon j'ai essayé ton autre solution et sans me provoquer un message d'erreur, l'affichage de ma page s'arrête en cours.

    C'est désespérant

    Je viens de m'appercevoir d'une faille "peut être". Si dans mes options Internet > onglet général > fichiers temporaires > paramètres je mets sur "à chaque visite de la page" le script de session fonctionne en revanche si je laisse sur "automatique", même si la session est tuée, il garde en mémoire ma page et la session qui était affectée puisqu'il me raffiche bonjour hpl76 (logué donc) au lieu de bonjour internaute. Zarb, non ? Quelqu'un connait le truc ? Ca fait pareil avec les boutons précédents/suivants...On dirait que la session ne meurt pas sur le coup lol

  12. #12
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2005
    Messages : 241
    Par défaut
    Bonjour,

    ton navigateur a stocké temporairement la page générée. Si tu veux obliger à recharger une page générée dynamiquement, il vaut mieux s'intéresser au header HTTP cache-control.

    Cordialement,

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

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par hpl76 Voir le message
    ...
    On dirait que la session ne meurt pas sur le coup lol
    ...
    Je te rassure, après un session.invalidate(), la session est "morte"
    Par contre, elle peut se recréer à vitesse grand V si par exemple dans ton code tu as un request.getSession() ==> nouvelle session immédiatement !

    Par contre, le cas que tu soulèves est typique du cache du navigateur et de ce côté, IE avait de curieux comportement en version 4, 5 mais plus à partir de la 6 (de mémoire )
    Même avec le pragma no-cache on pouvait avoir des surprises (il faisait un peu ce qu'il veut).
    Comme le dit Desboys, tu peux déjà essayer la ribambelle d'attributs
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        <meta http-equiv="pragma" content="no-cache" />
        <meta http-equiv="cache-control" content="no-cache" />
        <meta http-equiv="expires" content="0" />
    et tester à nouveau...
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  14. #14
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    349
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 349
    Par défaut
    Bonjour,

    Merci de votre soutien et votre patience.

    Je connais bien en effet les attributs dont tu parles mais je ne pensais pas devoir en arriver là (PHP pour le coup n'a pas ce problème). Si j'attaque les dites pages via l'url ca fonctionne maintenant, je suis renvoyé à la page de login en revanche on peut rien faire contre les boutons suivant / précédent car eux provoquent encore la tuile.

    Ca devient bon.

    hpl76 reconnaissant

Discussions similaires

  1. Réponses: 11
    Dernier message: 19/08/2013, 11h05
  2. Détruire les variables d'une session
    Par kespy13 dans le forum Langage
    Réponses: 6
    Dernier message: 05/05/2006, 17h13
  3. Réponses: 6
    Dernier message: 11/10/2005, 15h18
  4. [C#] Les variables de sessions
    Par BilTCD dans le forum ASP.NET
    Réponses: 3
    Dernier message: 11/08/2005, 15h01
  5. Effacer les variables de session
    Par glsn dans le forum ASP
    Réponses: 2
    Dernier message: 12/12/2003, 13h42

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