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

JSF Java Discussion :

Développement Web: Thread local


Sujet :

JSF Java

  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2011
    Messages : 100
    Par défaut Développement Web: Thread local
    Bonjour
    pour le besoin de mon application web (JSF/MyFaces, Tomact ) (web + service + DAO) je dois conserver les informations de l'utilisateur, et de pouvoir les exploiter plus tard (niveau DAO ou Service).

    la solution, j'ai essayé de mettre en place un Thread local dans le quel je stocke le User, et je le récupére plus tard niveau DAO.

    le problème quand deux utilisateurs se connectent, les informations de l’ancien sont écrasées par celle du nouveau (ce qui normale puisque mon thread local est "static" )

    quelqu’un pourrait m'expliquer comment procéder pour mettre en place ce thread par session utilisateur?

    ContextUtils.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
    15
    16
     
    public final class ContextUtils implements Serializable {
     private static ThreadLocal userInfos = new ThreadLocal() {
           protected Object initialValue() {
            return new Context();
          }
       }
     public static Context getContext() {
            return (Context) userInfos.get();
        }
    public static Context initContext() {
            Context context = new Context();
            setContext(context);
            return context;
        }
    }
    Context.java
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    public class Context implements Serializable {
    	private static final long serialVersionUID = 5484238902280571699L;
     
    	private UtilisateurDto user;
    	private List<HabilitationDto> habilitations;
    // getter + setter
    ...
    }
    authentificationBean.java
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    public class ConnexionBean  implements ActionListener, Serializable {
    public void seConnecter(ActionEvent event) {
    ....
    UtilisateurDto userDto = utilisateurService.authentifier(login, password);
     
    List<HabilitationDto> habils = habilitationService.chargerListHabilitationByProfil();
     
    context.setUser(userDto);
    context.setHabilitations(habils);
    }
    }

    Dao.java (plus tard dans l'application)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ContextUtils.getContext().getHabilitation();
    ContextUtils.getContext().getUser();
    ..

  2. #2
    Membre éprouvé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2011
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Novembre 2011
    Messages : 67
    Par défaut
    Salut,

    Si le but est de conserver les informations d'un utilisateur, utilise un bean JSF en scope session.

    Une fois l'utilisateur connecté, stocke l'objet utilisateur (entité) dans ton bean session, et elles seront accessibles à tout moment le temps de sa session.

  3. #3
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2011
    Messages : 100
    Par défaut
    Hello

    Le but est bien de conserver les informations de l'utilisateur connecté.

    merci pour ta proposition, je vais la mettre en place et je creuse un peu coté Thread local qui doit normalement gérer ce type de problématique, je ne manquerai pas de te tenir au courant.

  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 : 45
    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
    ThreadLocal associe l'information "au thread" et pas à autre chose. tu peux bien entendu t'en sortir avec ça, mais il faut bien penser à mettre en place l'état au début de chaque requete car ton conteneur n'associe aucun thread à une session utilisateur, ce serait bien trop couteux.

    Comme tu utilise du JSF, personellement, j'utiliserais simplement FacesContext.getcurrentInstance().

    Attention cependant, ca signifie que ton DAO est maintenant dépendant de ta techno de présentation, ce qui n'est pas nécessairement voulu.

    Personellement, j'ai plutot tenadance à résoudre ce genre de problématique avec Spring et en laissant spring faire tout le boulot de référencement


    N'oublie pas non plus que ThreadLocal stocke l'information "dans le thread" et non pas dans l'instance ThreadLocal, ce qui implique qu'elle ne sera nettoyée que si tu pense sur ce thread à appeler remove() ou que le thread lui même vient à mourir. Si les données sont consistantes (directement ou indirectement) ça peut être une méchante source de memory leak!

  5. #5
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2011
    Messages : 100
    Par défaut
    Bonjour à tous

    j ai laissé tombé l'histoire du threadLocal, j’utilise maintenant la session jsf

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Object sessionO = FacesContext.getCurrentInstance().getExternalContext().getSession(false);
    if (sessionO != null) {
        HttpSession session = (HttpSession) sessionO;
        session.setAttribute(Context.CONTEXT_SESSION_NAME, context);
    }
    merci à toutes et à tous

Discussions similaires

  1. [Mobile] Développement web pour PAD
    Par mike-sixteen dans le forum Langages de programmation
    Réponses: 3
    Dernier message: 24/12/2004, 10h16
  2. [Plugin] Développement web
    Par olivangel dans le forum Eclipse Java
    Réponses: 3
    Dernier message: 14/10/2004, 08h36
  3. CORBA sur serveur web en local
    Par barberot dans le forum CORBA
    Réponses: 8
    Dernier message: 31/03/2004, 08h28
  4. [Kylix] Kylix et le développement web...
    Par nahmsath dans le forum EDI
    Réponses: 4
    Dernier message: 24/10/2002, 19h27

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