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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 349
    Points : 133
    Points
    133
    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 confirmé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    383
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 383
    Points : 468
    Points
    468
    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 habitué
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    349
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 349
    Points : 133
    Points
    133
    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 confirmé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    383
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 383
    Points : 468
    Points
    468
    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
    Points : 9 529
    Points
    9 529
    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"

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 349
    Points : 133
    Points
    133
    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 confirmé 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
    Points : 519
    Points
    519
    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
    Points : 9 529
    Points
    9 529
    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+

  9. #9
    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
    Points : 9 529
    Points
    9 529
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par hpl76 Voir le message
    ...
    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 ?
    Alors, c'est tout à fait normal.
    Il y a une petite subtilité dans le tag <jsp:useBean> :

    Si tu utilises l'attribut "class=", le fonctionnement n'est pas identique à l'attribut "type=".
    Dans le premier cas, si la classe n'existe pas dans le scope, il la créé et la met dans le scope voulu.
    Dans le deuxième cas, si elle n'existe pas dans le scope, il renvoie NULL

    Le cas 1 implique également un constructeur sans argument (obligatoire)

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 349
    Points : 133
    Points
    133
    Par défaut
    Excusez-moi, je ne maitrise pas tous les termes comme scope...ces choses me sont encore peu familières, j'y vais à tâton...

    Dans mon cas et dans tous les cas de sites web, quelle est la meilleure sécurité possible pour pallier au problème de façon à ce que la session soit morte à l'appel de la fonction session.invalidate();

    car si je suis un p'tit malin après la déconnexion je retappe l'url d'où je viens et j'accède aux infos :\

  11. #11
    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
    Points : 9 529
    Points
    9 529
    Billets dans le blog
    1
    Par défaut
    Le "scope" correspond à la zone dans laquelle tu stockes l'information.
    Il y en a 4 courantes :
    - request (uniquement accessible le temps de la requête)
    - session (accessible tant que la session est valide)
    - application (accessible tant que l'application est active et quelque soit le "client")
    - page (accessible uniquement à l'intérieur de la page)

    Le plus sûr pour "flinguer" la session est session.invalidate().
    Tout ce qui existait dedans sera détruit

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 349
    Points : 133
    Points
    133
    Par défaut
    Merci encore pour ce complément

    Je dois mal saisir quelque chose, le truc c'est que je détruis bien avec :
    session.invalidate();

    ma page deco.jsp qui est jouée au clic sur le lien déconnexion en page2.jsp.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <jsp:useBean id="user" class="java.util.ArrayList" scope="session" />
    <%
    if(user.isEmpty()){ //la session est vide, elle n'existe pas
        out.println("Que fais-tu ici ?"); //on affiche ceci
    }else{//sinon c'est qu'il y a une session ouverte
        session.invalidate();//on la détruit
        response.sendRedirect ("index.jsp");//on redirige vers l'index.jsp
    }
    %>
    Tout est ok (à priori). Pour tester la sécurité, je rappelle la page2.jsp et oh surprise elle s'affiche !!!

    Le début de cette page :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <jsp:useBean id="user" class="java.util.ArrayList" scope="session" />
    <% if(user.isEmpty()){ //ca devrait être le cas
        response.sendRedirect ("index.jsp");//on renvoie vers l'index
            }else{ %>//sinon c'est que tout va bien et on lit la page (ce qu'il se passe d'ailleurs)
    En revanche à la moindre action sur cette page, je reviens bien au pavé de login.

    Sinon autre chose, ces syntaxes sont bonnes ? Mêmes résultats ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    if(mavar==null){
    if(user.isEmpty()){
    if(user.isEmpty(false)==null){
     
    VS
     
    if(mavar != null){
    if(user.isEmpty(true)==null){
    if(!user.isEmpty()){
    hpl76 qui tient le bon bout (enfin j'crois )

  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
    Points : 9 529
    Points
    9 529
    Billets dans le blog
    1
    Par défaut
    Ça ressemble à une page en cache dans le navigateur...
    Quand tu dis "je rappelle la page page2.jsp" tu la rappelles comment au juste ?
    - un back dans le navigateur ?
    - autre cas ?

    Pour ça
    Citation Envoyé par hpl76 Voir le message
    Sinon autre chose, ces syntaxes sont bonnes ? Mêmes résultats ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    if(mavar==null){
    if(user.isEmpty()){
    if(user.isEmpty(false)==null){
     
    VS
     
    if(mavar != null){
    if(user.isEmpty(true)==null){
    if(!user.isEmpty()){
    j'ai du mal à suivre ce que ça fait, mais il est clair que ce n'est pas la même chose puisque ton premier test (évalué en premier) est le contraire de celui de la v2

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 349
    Points : 133
    Points
    133
    Par défaut
    1 -
    Citation Envoyé par OButterlin Voir le message
    Ça ressemble à une page en cache dans le navigateur...
    Quand tu dis "je rappelle la page page2.jsp" tu la rappelles comment au juste ?
    - un back dans le navigateur ?
    - autre cas ?
    Je regarde dans l'historique url ou je place mon curseur dans la barre d'url et je saisis le nom, l'url de la page source.

    Désolé pour tout ce cas particulier, c'est tout moi

    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 de trouver le moyen de dire : "si variable session user existe alors"...

  15. #15
    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
    Points : 9 529
    Points
    9 529
    Billets dans le blog
    1
    Par défaut
    C'est sûr que par l'historique, tu retrouveras toujours ta page, mais l'essentiel est que tu ne puisse rien en faire

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 349
    Points : 133
    Points
    133
    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.

  17. #17
    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
    Points : 9 529
    Points
    9 529
    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 )

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 349
    Points : 133
    Points
    133
    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

  19. #19
    Membre averti
    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
    Points : 399
    Points
    399
    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,

  20. #20
    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
    Points : 9 529
    Points
    9 529
    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...

Discussions similaires

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

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