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

Tomcat et TomEE Java Discussion :

Problème de multi-session


Sujet :

Tomcat et TomEE Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    199
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 199
    Par défaut Problème de multi-session
    Bonjour,
    Je développe une appli web et j'ai un problème de session : quand un utilisateur se connecte, je mets un objet "user" (de type User : nom, userid, ...) en session (fichier SignonAction.java):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ... 
    request.getSession().setAttribute("USER", user);
    ...
    Mes classes action héritent toutes d'une classe BaseAction.java qui créé une variable de type User :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    User user = (User) request.getSession().getAttribute("USER");
    instancié dans la fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response)
    Ainsi, je peux théoriquement accéder à l'objet "user" dans toutes mes classes.

    Or, il se trouve qu'un utilisateur qui lance un calcul assez long voit ce calcul s'arrêter brutalement ; le fichier de trace indique une erreur de type java.lang.NullPointerException
    et la ligne en cause est la suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    un_autre_objet.setUserid(user.getUserid());
    Or il se trouve que cela arrive systématiquement quand une autre personne se connecte, quelle qu'elle soit. Il semblerait que la nouvelle connexion entraine la suppression de l'attribut user de la session du premier utilisateur.

    Quelqu'un sait d'où peut provenir le problème ?
    Je ne sais pas si cela a un rapport, mais cette appli a été réinstallée plusieurs fois, et dernièrement sur un nouveau serveur, et il me semble que depuis le JSESSIONID n'apparait plus dans l'url. Est-ce normal ? Est-ce lié ?

    Merci infiniment pour votre aide.

  2. #2
    Rédacteur
    Avatar de lunatix
    Homme Profil pro
    Architecte technique
    Inscrit en
    Novembre 2002
    Messages
    1 960
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Novembre 2002
    Messages : 1 960
    Par défaut
    a mon avis la disparition du jsession ID n'est pas en cause (ca doit passer en cookie). Tu peux valider en utilisant un navigateur qui refuse les cookies, le jsessionID doit revenir.

    a vue de nez, tu dois bosser avec des actions qui ne sont pas threadSafe (struts1 ou spring MVC ou servlet par exemple) et quelque part referencer la session ou le user en attribut de servlet/action.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    199
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 199
    Par défaut
    Merci pour ta réponse.
    J'ai effectivement fait le test en déactivant les cookies et le JSESSIONID réapparait dans l'url... Mais plus rien ne marche car, si j'ai bien compris, il faudrait alors "encoder" les url (encodeURL()), ce qui n'est actuellement pas le cas...

    Je travaille effectivement avec Struts 1.2.6.

    a vue de nez, tu dois bosser avec des actions qui ne sont pas threadSafe (struts1 ou spring MVC ou servlet par exemple) et quelque part referencer la session ou le user en attribut de servlet/action
    Je ne comprends pas : tu as une suggestion pour corriger ce problème ?

    Car par ailleurs, d'autres tests montrent que si 2 utilisateurs différents se connectent d'un même poste (j'ai fait le test), l'identifiant de session
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    request.getSession().getId()
    reste le même (!?), ce qui est évidemment problématique si un seul utilisateur veut se connecter sous 2 profils différents au même moment (2 onglets par exemple). Je suppose qu'il doit bien y avoir un moyen de parvenir à cela...

    Alors, comment faire ??

    Merci !

  4. #4
    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
    de mémorie (c'est loin) et vu que ca a l'air d'être du struts. Struts ne crée pas une instance de Action par requete, il en crée une seule qu'il réutilise. Donc toutes tes requetes partagent le même action, et donc le même champ User. C'est uniquement avec le Form que tu as la garantie d'une instance / requete

  5. #5
    Rédacteur
    Avatar de lunatix
    Homme Profil pro
    Architecte technique
    Inscrit en
    Novembre 2002
    Messages
    1 960
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Novembre 2002
    Messages : 1 960
    Par défaut
    En clair en Struts1 ou spring mvc, les champs de type attributs sont partagés

    exemple d'erreur classique en Struts1/springmvc/servlet en pseudo java
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    class action {
     
    private User user; <-- Ce champ est partagé par tout le monde.. d ou mélange
     
    public ... execute(request, response, form, etc..) {
     
       user = service.getUserFromLogin(...);
       session.setAttribute(User);
     
     
    }
     
    }

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    199
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 199
    Par défaut
    Merci beaucoup pour vos réponses !

    exemple d'erreur classique en Struts1/springmvc/servlet en pseudo java

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    class action {
     
    private User user; <-- Ce champ est partagé par tout le monde.. d ou mélange
     
    public ... execute(request, response, form, etc..) {
     
       user = service.getUserFromLogin(...);
       session.setAttribute(User);
     
     
    }
     
    }
    Effectivement, lunatix, c'est exactement ce (l'erreur) que je fais...
    Mais du coup, quelle est l'alternative ? Y-a-t'il une autre façon de faire ? Celle de OButterlin ?

    Encore merci.

  7. #7
    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 jgfa9 Voir le message
    ...
    Car par ailleurs, d'autres tests montrent que si 2 utilisateurs différents se connectent d'un même poste (j'ai fait le test), l'identifiant de session
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    request.getSession().getId()
    reste le même (!?), ce qui est évidemment problématique si un seul utilisateur veut se connecter sous 2 profils différents au même moment (2 onglets par exemple). Je suppose qu'il doit bien y avoir un moyen de parvenir à cela...
    A vrai dire, c'est dans le même navigateur que tu as le partage de session.
    Tu peux avoir 2 sessions avec 2 navigateurs (Firefox et IE par exemple) sur le même poste... mais bref, ton problème reste entier.

    Ce que j'ai fait (il y a longtemps) est d'ajouter un identificateur de fenêtre qui est "trainé" partout (form + lien) pour tout accès à un contrôleur.
    Plutôt que d'enregistrer dans la session, j'enregistre dans une Map<String, Map> dont la clé est cet identificateur de fenêtre. La Map est sauvegardée en session.
    (Si ça peut t'aider...)
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

Discussions similaires

  1. Problème de multi session client
    Par pafi76 dans le forum JSF
    Réponses: 1
    Dernier message: 03/07/2012, 09h51
  2. Problème formulaire multi-page avec SESSION
    Par Shakuro dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 2
    Dernier message: 20/11/2010, 13h31
  3. problème avec les sessions
    Par DiverSIG dans le forum Langage
    Réponses: 2
    Dernier message: 28/11/2005, 11h01
  4. Problèmes avec les Sessions
    Par alexthomas dans le forum Langage
    Réponses: 5
    Dernier message: 20/11/2005, 21h53
  5. Problème avec les sessions
    Par philippef dans le forum Langage
    Réponses: 2
    Dernier message: 27/10/2005, 15h19

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