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 :

[Tomcat]Problème de connexion simultanée en JSP/Tomcat


Sujet :

Tomcat et TomEE Java

  1. #1
    Nouveau membre du Club
    Inscrit en
    Octobre 2002
    Messages
    24
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Octobre 2002
    Messages : 24
    Points : 26
    Points
    26
    Par défaut [Tomcat]Problème de connexion simultanée en JSP/Tomcat
    Bonjour,
    Je développe un site bancaire et j'ai un petit souci :
    J'aimerai qu'un client ne puisse se connecter qu'une seule fois à la fois. C'est à dire qu'il ne fautpas qu'il y ai 2 sessions JSP ouvertes avec les mêmes variables de sessions login et motde passe. Comment procéder pour répondre à ce besoin ? Quelqu'un peut t-il me guider ?
    Merci d'avance



    [Modéré par Didier] : ajout de tag dans le titre - Les règles du forum Java

  2. #2
    Membre expérimenté
    Avatar de zekey
    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 036
    Points : 1 403
    Points
    1 403
    Par défaut
    Je vois 2 solutions:

    1) Sauvegarder au niveau application (servlet partagée entre toutes les sessions) l'ensemble des clients connectés. C'est à dire que lorsque un client se connecte tu rajoutes son nom dans une hashmap si il n'est pas deja présent sinon tu empoeche le login. Lorsqu'il se deconnecte ou lorsque la session est invalidée tu l'enleve. Pour ce faire il faut implementer un HTTPSessionListener qui sera appellé par le servlet engine lors de la destruction de la session(timeout).

    2) Meme chose mais tu garde le status sur DB au lieu du servletContext.
    Steve Hostettler
    est ton ami(e) et le tag aussi.

  3. #3
    Membre expérimenté
    Avatar de zekey
    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 036
    Points : 1 403
    Points
    1 403
    Par défaut
    J'ai oublié de préciser que le probleme de cette solution est qu'un client qui ne deconnecte pas mais ferme le browser sera toujours considéré comme connecté jusqu'au tieout de la session.
    Steve Hostettler
    est ton ami(e) et le tag aussi.

  4. #4
    Nouveau membre du Club
    Inscrit en
    Octobre 2002
    Messages
    24
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Octobre 2002
    Messages : 24
    Points : 26
    Points
    26
    Par défaut Techniquement c'est coment ?
    Bonjour ze_key
    J'ai compris assez légèrement tes solutions. Mais techniquement ça se passe comment ? je veux dire, t'as pas des exemples de code à me fournir ?
    Merci d'avance

  5. #5
    Membre expérimenté
    Avatar de zekey
    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 036
    Points : 1 403
    Points
    1 403
    Par défaut
    A un moment ou à un autre tu authentifie l'utilisateur.
    Normalement dans une servlet ou mieux dans une action.
    A ce moment la apres que le mot de posse eut été validé tu fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Object userId=request.getSession().getServletContext().getAttribute(userId);
    if(userId==null){
       //l'utilisateur n'est pas dans la map docnc ne s'est pas encore connecté
       //Met le userId dans la map partagée entre toutes les sessions
       request.getSession().getServletContext().setAttribute(userId, userId);
       //On sauvegarde le userId pour savoir qui est dans cette session.
       request.getSession.setAttribute("USER_ID", userId);
    }else{
       //deja connecté on refuse de le laissé se connecter
      ....
    }
    Au moment ou l'utilisateur appuis sur logout tu invalide la session
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    //Invalide la session
    request.getSession().invalidate()
    Donc maintenant il faut veiller a sortir l'utilisateur de la map partagée
    quand la session est invalidée.
    Pour ce la il faut implemementer l'interface HttpSessionListener.
    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
     
     
    public class SessionTimeoutListener implements HttpSessionListener{
     
    	public void sessionCreated(HttpSessionEvent arg0) {
    	}
     
    	public void sessionDestroyed(HttpSessionEvent arg0) {
    		HttpSession s = arg0.getSession();
                    //Qui est connecté dans cette session
                    String userId=(String)s.getAttribute("USER_ID");
    		//On enleve l'utilisateur de la liste des users connectés
                   s.getServletContext().removeAttribute(userId);
    	}
    }
    Maintenant il faut définir notre listener dans le web.xml
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    <listener-class>SessionTimeoutListener</listener-class>
        </listener>

    Mais j'atire de nouveau ton attention surl le fait que si un user ne se deconnecte pas proprement, il ne pourra plus se reconnecter jusqu'au timeout de la session. (bien fait pour lui)
    Steve Hostettler
    est ton ami(e) et le tag aussi.

  6. #6
    Nouveau membre du Club
    Inscrit en
    Octobre 2002
    Messages
    24
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Octobre 2002
    Messages : 24
    Points : 26
    Points
    26
    Par défaut Qu'est ce qu'un hashmap ?
    Bonjour ze_key
    Ta solution est géniale. Je la comprends parfaitement. Mais j'ai encore deux questions à poser :
    1- Qu'estce qu'un hashmap ? est - ce une structure de stockage comme une collection ? Si oui, à que moment tu ajoute la nouvelle connection dans le hashmap ?

    2- Le HttpSessionLister est un écouteur qui écoute quoi ? Comment faire le lien avec ma session courante ?

    Merci de m'éclaircir ces choses qui me sont encore floues .

  7. #7
    Membre expérimenté
    Avatar de zekey
    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 036
    Points : 1 403
    Points
    1 403
    Par défaut
    1) Une HashMap (table de hachage) est une table qui a tous les éléments que met dedans fais correspondre une clé. Cette clé est (en l'occurence le nom de l'utilisateur) est transformé en nombre selon une fonction mathématique. Ce nombre sert d'index dans un tableau pour pouvoir effectuer une recherche rapide.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
       //Met le userId dans la map partagée entre toutes les sessions
       request.getSession().getServletContext().setAttribute(userId, userId);
    2) Le listener surveille la création et la destruction de session. Il est appellé par tomcat sur la session courante.


    Une petite remarque, ne le prend pas mal (et je ne suis de loin pas un guru) mais peut-être que ton niveau en java est un peu leger (rapport au hashtable) pour faire du J2EE.
    Tu y arrivera, pas de doute, mais pas forcément de la bonne facon. Ca vaudrait peut être le coup d'investir un peu de temps dans une autoformation java un peu plus poussée ou en tout les cas si tu maitrise la syntaxe sur les innombrables capacités de l'API. Cela permet souvent de gagner bcp de temps.
    Steve Hostettler
    est ton ami(e) et le tag aussi.

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 106
    Points : 130
    Points
    130
    Par défaut
    c'est ce dont je te parlais l'autre jour ze_key.

    Avant de faire des sites banquaires en J2EE, il faudrait d'abord apprendre à utiliser JAVA.

    Shingo : sur le site de sun, tu as une page de doc qui reprend tous les composants du sdk : collections, securite, reflection.......
    Voici le lien : http://java.sun.com/j2se/1.5.0/docs/

    C'est absolument génial. Tu as des tutoriaux, les API détaillées....C'est un boulot énorme que SUN a fait. Autant en profiter

    Tu iras plus vite à passer 2 jour pour faire une overview de ces composants plutot que de tatonner....Et surtout, la qualité de ton appli s'en fera ressentir.

    Enfin ce n'est qu'un conseil.

    Bon courage !

    tchou
    PHP / J2EE

  9. #9
    Nouveau membre du Club
    Inscrit en
    Octobre 2002
    Messages
    24
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Octobre 2002
    Messages : 24
    Points : 26
    Points
    26
    Par défaut Ca ne marche pas
    Bonjour les amis
    J'ai suivi vos conseils et je vous en remercie. Cependant, ilme semble que HttpSessionListener soit la bonne solution mais je ne l'utilise pas correctement. Dans votre code, on ajoute le useId ds le servletContext. Mais servletConetexte est partagé entre tous les utilisateurs. Cela veux dire que un autre utilisateur ne pourra se connecter. Ce n'est pas ce que je veux. Moi je veux que tous les utilisateurs puissent se connecter, mais un utilisateur ne peut e logger plus d'une fois àla fois.

    Veuillez éclaircir mes idées et m'aider svp.
    Merci d'avance

  10. #10
    Membre expérimenté
    Avatar de zekey
    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 036
    Points : 1 403
    Points
    1 403
    Par défaut
    Peux tu préciser logguer et connecter ?
    Steve Hostettler
    est ton ami(e) et le tag aussi.

  11. #11
    Nouveau membre du Club
    Inscrit en
    Octobre 2002
    Messages
    24
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Octobre 2002
    Messages : 24
    Points : 26
    Points
    26
    Par défaut Logguer = connecter
    Bonsoir
    Pour moi, logguer = connecter, c'est à dire que son login et mot de passe sont bons et on peut démarrer une session.

  12. #12
    Membre expérimenté
    Avatar de zekey
    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 036
    Points : 1 403
    Points
    1 403
    Par défaut Re: Ca ne marche pas
    Citation Envoyé par shingo
    Bonjour les amis
    J'ai suivi vos conseils et je vous en remercie. Cependant, ilme semble que HttpSessionListener soit la bonne solution mais je ne l'utilise pas correctement. Dans votre code, on ajoute le useId ds le servletContext. Mais servletConetexte est partagé entre tous les utilisateurs. Cela veux dire que un autre utilisateur ne pourra se connecter. Ce n'est pas ce que je veux. Moi je veux que tous les utilisateurs puissent se connecter, mais un utilisateur ne peut e logger plus d'une fois àla fois.

    Veuillez éclaircir mes idées et m'aider svp.
    Merci d'avance
    Oui donc ca marche puisque le userId n'est rajouté que lorsque l'utilisateur s'est deja authentifié une fois. On ne l'empeche pas de se connecter au systeme mais simplement de s'authentifier une seconde fois. Puisque le test pour savoir si il est deja connecter à lieu au moment de l'authentification et pas au moment ou il essaye de chercher une page quelconque.
    Steve Hostettler
    est ton ami(e) et le tag aussi.

Discussions similaires

  1. Problème configuration : connexions simultanées
    Par chalumea dans le forum Installation
    Réponses: 0
    Dernier message: 28/07/2009, 11h25
  2. Problème de Connexion à Oracle sous JSP
    Par proganas dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 18/10/2008, 03h01
  3. problème de connexion simultanée à 2 BDD oracle
    Par paradeofphp dans le forum Connexions aux bases de données
    Réponses: 13
    Dernier message: 07/06/2007, 15h36
  4. [Oracle] Problème de connexions simultanées différentes
    Par schnito dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 02/06/2006, 11h45
  5. [Tomcat, Postgresql & JSP] Problème de connexion JDBC
    Par quichedood dans le forum Tomcat et TomEE
    Réponses: 3
    Dernier message: 14/03/2006, 13h27

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