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 :

Architecture d'une solution avec de multiples WAR pour partage de session


Sujet :

Tomcat et TomEE Java

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 139
    Points : 53
    Points
    53
    Par défaut Architecture d'une solution avec de multiples WAR pour partage de session
    Bonjour à tous,

    Je suis en train de bosser sur une application Servlet/JSP et je voudrais m'assurer de la meilleure architecture pour simplifier la déployabilité et la maintenance...

    Mon projet est actuellement constitué de 2 parties que je voudrais indépendante...une partie front end (aujourd'hui déployée dans un WAR indépendant) et la partie back end dans un autre WAR.
    Je voulais décoreller le front et le back dans 2 WAR différents car j'ai plusieurs front différents (look and feel et fonctionnalités différentes) et de ce fait améliorer la flexibilité de la solution en n'impactant pas le backend pour chaque mise à jour d'un de mes frontend.

    à ce jour j'ai:
    Browser (Client) --> JSP (WAR1) --> Servlet (WAR2)

    Jusque là tout va bien, mais j'ai rencontré quelques problèmes de partage de session entre les WAR, j'ai pu le contourner en utilisant une nouvelle fonctionnalité de l'API Servlet 3.0 qui permet de changer le sessionCookiePath et le le rendre crossContext.
    Le seul inconvénient c'est que je dois passer par le ServletContext qui s'avère être partagé donc si j'ai un utilisateur 1 qui se connecte (login) à mon Front (WAR1), le backend (WAR2) crée une session. Par contre si un second utilisateur se loggue à mon Front (WAR1), le backend crée une nouvelle session mais écrase la session de l'utilisateur 1....

    Donc je pense que j'ai un souci d'architecture mais je ne vois pas comment faire, je voulais séparer les deux pour faciliter le déploiement mais j'ai peur de mettre en place une solution de session trop fragile...auriez vous des suggestions d'architecture pour répondre à ma problématique ?

    Merci,
    Tiamat.

  2. #2
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 274
    Points : 4 141
    Points
    4 141
    Par défaut
    peux tu nous montrer un peu de code ?

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 139
    Points : 53
    Points
    53
    Par défaut
    Bien sur ! je voulais éviter pour plus parler architecture mais voici:

    Servlet Login (dans mon WAR2):

    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
     
    public class LoginUserWithPassword extends HttpServlet {
    	private static final long serialVersionUID = 1L;
    	static Logger log = Logger.getLogger(LoginUserWithPassword.class);       
     
    	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
     
    		request.setCharacterEncoding("UTF-8");
    		response.setCharacterEncoding("UTF-8");
     
    		...(gestion du login utilisateur)
     
    			//opening a session for this user
    			HttpSession session = request.getSession();
     
    			session.getServletContext().getContext("/{applicationContextRoot}").setAttribute("nom",usr.nom);
    			session.getServletContext().getContext("/{applicationContextRoot}").setAttribute("prenom", usr.prenom);
    			session.getServletContext().getContext("/{applicationContextRoot}").setAttribute("login", usr.email);
    			session.getServletContext().getContext("/{applicationContextRoot}").setAttribute("id", String.valueOf(usr.id_user));
    			session.getServletContext().getContext("/{applicationContextRoot}").setAttribute("id_right",String.valueOf(ur.id_right));
    			session.getServletContext().getContext("/{applicationContextRoot}").setAttribute("right",url.right);
    			session.getServletContext().getContext("/{applicationContextRoot}").setAttribute("session",session.getId());

    login.jsp (dans le WAR1):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    $(document).ready(function() {
     
                //loading session variables from Session
                Gnom = '<%= (String) (request.getSession().getServletContext().getContext("/{applicationContextRoot}").getAttribute("nom")) %>';
                Gprenom = '<%= (String) (request.getSession().getServletContext().getContext("/{applicationContextRoot}").getAttribute("prenom")) %>';
                Glogin = '<%= (String) (request.getSession().getServletContext().getContext("/{applicationContextRoot}").getAttribute("login")) %>';
                Gsession = '<%= (String) (request.getSession().getServletContext().getContext("/{applicationContextRoot}").getAttribute("session")) %>';
     
                console.log("nom from session: "+Gnom);
                console.log("prenom from session: "+Gprenom);
                console.log("login from session: "+Glogin);
                console.log("Session ID: "+Gsession);
    voici mon context.xml

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    <Context sessionCookiePath="/" crossContext="true">
     
        <!-- Default set of monitored resources -->
        <WatchedResource>WEB-INF/web.xml</WatchedResource>
     
    </Context>
    et mon web.xml

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    <session-config>
        <session-timeout>30</session-timeout>
        <cookie-config>
        	<path>/</path>
    	</cookie-config>
      </session-config>

  4. #4
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 274
    Points : 4 141
    Points
    4 141
    Par défaut
    Le servlet context représente ton application, ton war, donc quand tu écris dedans les données sont partagés par tous les utilisateurs, donc ça me semble normal que les données soient écrasées par un nouvel utilisateur.

Discussions similaires

  1. Vendre une solution avec ETL open source
    Par Juliana dans le forum Alimentation
    Réponses: 20
    Dernier message: 17/09/2008, 14h35
  2. Comment structurer une application avec des multiples versions ?
    Par Worldofdada dans le forum Windows Forms
    Réponses: 5
    Dernier message: 31/05/2007, 10h52
  3. [VS2005] Comment ajouter une solution avec VS2005
    Par Khrysby dans le forum Visual Studio
    Réponses: 1
    Dernier message: 24/10/2006, 03h34
  4. Calculs dans une requete avec conditions multiples
    Par Sha1966 dans le forum Access
    Réponses: 3
    Dernier message: 13/01/2006, 15h18
  5. XML / Xpath -> une solution avec Builder?
    Par say dans le forum C++Builder
    Réponses: 3
    Dernier message: 12/05/2005, 11h56

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