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 :

Multifenetrage avec une seule instance de navigateur web


Sujet :

Servlets/JSP Java

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    314
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 314
    Par défaut Multifenetrage avec une seule instance de navigateur web
    Bonjour,

    Je souhaiterais pouvoir ouvrir plusieurs session mon application web avec authentification dans la même instance d'un navigateur.
    Comme cela est impossible, je me suis renseigné et apparement ce problème peut être contourné en créant un identifiant de fenêtre.


    Quelqu'un aurait-il une idée sur l'implémentation des ses identifiant ?

    Merci.

  2. #2
    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
    Voici comment j'avais procédé...

    Dans la phase de login, je génère un identificateur de fenêtre (en utilisant un System.currentTimeMillis() par exemple) qui me servira d'identificateur de fenêtre.

    Tous les beans représentant les données de la page contiennent cette valeur.

    Toutes les pages jsp contiennent un champ caché pour envoyer cette valeur aux contrôleurs.

    Ensuite, il suffit de stocker les informations d'une "session utilisateur" dans une map dont la clé est l'identifiacteur de fenêtre au travers d'un objet spécialisé qu'on pourrait appeller "WindowSession".
    Donc, à chaque requête http, on récupère l'objet WindowSession grâce à l'identificateur de fenêtre, et on transmet cet objet dans le request...

    Quand on doit utiliser un lien <a>, il faut rajouter l'id de fenêtre à la liste des paramètres.

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

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    314
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 314
    Par défaut
    Merci pour ton aide.

    J'ai fait d'autres tests dans mon application. J'ai cependant un autre soucis au niveau de l'ouverture de multiple fenêtre.
    Je dispose d'un formulaire j'affiche des données provenant d'une base de données. Les données sont affichées dans le même formulaire après validation du formulaire. Si le même formulaire est ouvert dans deux pages différentes, il arrive que les données censées s'afficher dans le formulaire n°1 s'affiche également dans le formulaire n°2 ce qui provoque une perte de données.
    Pense-tu qu'il est possible de contourner ce problème grâce à l'utilisation d'identifiant de fenêtre ?

    Merci.

  4. #4
    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
    Ben oui, ça marche aussi dans ce cas...
    Mais il faut bien sûr que l'objet contenant les données de la page soit sauvegardé dans le context "WindowSession"
    Un truc dans le genre...
    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
     
    // Servlet
    ...
    public void service(HttpServletRequest request, HttpServletResponse response)
    {
       String windowSessionName = request.getParameter("WindowSessionName");
     
       // Récupération du WindowSession
       WindowSession windowSession = (WindowSession)request.getSession().getAttribute(windowSessionName);
     
       // Création de l'objet d'échange utilisé par la jsp
       DataPageBean pageBean = new DataPageBean();
       windowSession.putObject("NomPourLaPage", pageBean);
     
       ... 
     
       ResultSet rs =  stmt.executeQuery(...)
       while (rs.next())
       {
          ... chargement d'une liste dans pageBean
       }
     
       ... appel de la page jsp via requestDispatcher ou autre
     
    }
    Dans la page jsp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    <%
       String windowSessionName = request.getParameter("WindowSessionName");
     
       // Récupération du WindowSession
       WindowSession windowSession = (WindowSession)request.getSession().getAttribute(windowSessionName);
     
       DataPageBean pageBean = (DataPageBean)windowSession.getObject("NomPourLaPage");
     
    etc...
    %>
    Tu vois ce que je veux dire ?

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

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    961
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 961
    Par défaut
    Petite remarque : un utilisateur malfaisant pourrait essayer de changer son identifiant de fenêtre pour usurper la session de quelqu'un d'autre.

    L'implantation de OButterlin n'a pas ce problème, car les identifiants de pages sont stockés dans la session de l'utilisateur. Donc l'utilisateur ne pourrait voler que ses propres identifiants de fenêtre. Si en revanche vous choisissez de stocker ces identifiants dans une variable globale pour toute l'application, vous aurez besoin d'un mécanisme d'authentification... Mieux vaut donc utiliser les sessions comme OButterlin.

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    314
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 314
    Par défaut
    je comprends pas ce que représente ta classe WindowSession...
    Une collection?

  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
    La classe WindowSession est un objet conteneur, sauvegardé dans la session (HttpSession) sous le nom de l'identificateur de fenêtre...

    Il contiendrait différents types d'informations comme :

    - des informations sur l'utilisateur en cours
    - des informations sur les droits/rôles (si besoin)
    - une map<String, Object> pour sauvegarder des objets sous un nom
    - etc...

    C'est la map qui t'intéresse en l'occurrence...

    Plus clair ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    314
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 314
    Par défaut
    String windowSessionName = request.getParameter("WindowSessionName");
    Si j'ai bien compris ton raisonnement. Dans tes jsp, tu es contraint de stocker WindowSessionName dans un champ caché... ?

  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
    Billets dans le blog
    1
    Par défaut
    Comme tous tes formulaires (ou tous les liens) contiennent un champ caché nommé "WindowSessionName" contenant l'ID de la "WindowSession",
    tu récupères l'objet associé à la fenêtre en cours.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    <form action="...">
    <input type="hidden" name="WindowSessionName" value="<%=pageBean.getWindowSessionName()%>" />
    ...
    </form>
    Il y aurait bien un cas à tester, c'est celui de la redirection. Il me semble qu'on part sur un nouveau request (mais ça pourrait dépendre du serveur, à vérifier).

    Sinon, rien ne t'empêche (pour contourner ce problème) de faire un request.setAttribute("WindowSessionName", windowSessionName) dans la servlet, et de récupérer dans la jsp sous cette forme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <%
    String windowSessionName = request.getAttribute("WindowSessionName");
    if ( windowSessionName == null ) windowSessionName = request.getParameter("WindowSessionName");
    ...
    %>
    Ce qui est peut-être perturbant dans mon exemple, c'est que j'ai appelé le champ "WindowSessionName" et que dans la servlet (ou la jsp), la valeur représente l'ID de la fenêtre...
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    314
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 314
    Par défaut
    Que représente dans pageBean dans ton exemple un bean de stockage ?
    De plus d'après ton exemple, l'objet windowSession est stocké en session hors mon but est de ne pas utiliser les sessions.

    Merci pour ton aide.

Discussions similaires

  1. Une seule instance partagée avec plusieurs programmes
    Par CZVF_RS dans le forum Langages
    Réponses: 4
    Dernier message: 29/05/2013, 22h53
  2. Création de plusieurs sites Web avec une seule IP
    Par yoshï dans le forum Apache
    Réponses: 6
    Dernier message: 22/09/2010, 17h20
  3. [FAQ] une seule instance de mon appli avec Mutex
    Par kacedda dans le forum MFC
    Réponses: 2
    Dernier message: 26/11/2008, 09h44
  4. comment remplir 2 champs avec une seule listbox
    Par Didi17 dans le forum Access
    Réponses: 3
    Dernier message: 19/10/2005, 09h42

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