8 votes

Partage de l'objet Session entre différentes applications web

Ok, voici le problème

J'ai une application Java qui fonctionne au-dessus d'Apache Tomcat et j'ai aussi une autre application avec son propre fichier war qui fonctionne sur le même serveur.

Maintenant je veux authentifier l'utilisateur une fois et passer cette session à l'autre application.

Nous pouvons dire que le partage de session inter-domaine sur le même Apache Tomcat ... comment dois-je procéder .... ?

Merci.

5voto

ChssPly76 Points 53452

Tomcat fournit la fonctionnalité d'authentification unique par le biais d'une valve spécifiée dans le fichier Hôte dans la configuration de Tomcat :

<Host name="localhost" ...>
  <Valve className="org.apache.catalina.authenticator.SingleSignOn" />
</Host>

Certaines restrictions sont appliquées, consultez le lien ci-dessus (faites défiler jusqu'à la section "Single Sign On") pour plus de détails.

3voto

thethinman Points 309

Créez un jeton unique pour la session et placez-le dans une table de base de données à laquelle les deux applications ont accès.
Stocker le jeton dans le cookie de l'utilisateur.
Cela permet d'éviter le problème du partage des sessions et est également plus évolutif.

1voto

Master V Points 71

Voici comment le coder. Je l'ai fait pour un autre travail sur lequel je travaille .....

Première mise à jour

/etc/tomcatx/server.xml

Pour chaque contexte qui doit être partagé

 <Context path="/servlets" crossContext="true"..
 <Context path="/solutions2" crossContext="true"..

Ajoutez la balise crossContext=true à chaque contexte pour que le code puisse créer et envoyer des informations de session partagées.

..................................

Le code pour le modifier..

//Context 1 : Sending Servlet Add below
//So this is AuthSuccess - Within The master context doing authentication
//Given examples of vectors sessions and request from
//All the information now allows you to put those new
// provider and providerName session values back into AuthSuccess
//that is executed on other Context -
//In theory once it authenticates you can just store the output i.e.
//email/display/logged in and put it into other context - or...
//as it is process list etc on other context

//Vector example
Vector roles=new Vector();
roles.addElement("COOOGOOO");

 //Redirect url
 String redir="http://mydomain.com/solutions2/AuthSuccess";

 //Get session id
 String sessionid = session.getId();

HttpSession session = req.getSession(true);
session.putValue("provider2","provider\_session\_info");
session.putValue("providerName2","providerName");
 //Start new shared servlet context
 ServletContext myContext = getServletContext();

//Shared sessioname is obvious and it sends the session id followed by:

// objects,string,sessions,whatever that matches other end
myContext.setAttribute("MYSHAREDSESSION", sessionid);
myContext.setAttribute("GOOFY",roles);

//Send session directly
myContext.setAttribute("SharedSession",session);

//send HttpRequest
myContext.setAttribute("SharedRequest",request);

   //Redirect to new context/domain/subdomain
  Redirect(out,red,response);

//-------------------------------------------------------------

// Now within ther servlets of solution2 within 
// AuthSuccess call back the session info
// and process as per normal

 //Add this to new context path 
   //So it looks in the first context now
  ServletContext firstOne = getServletContext().getContext("/servlets");

  //returns previous session id
  String jsessionid= (String)firstOne.getAttribute("MYSHAREDSESSION");

  //Returns Session as was
  Session ProviderName=(Session)firstOne.getAttribute("SharedSession");
  //Returns session strings we need
  String g1=(String)ProviderName.getValue("provider2");
  String g2=(String)ProviderName.getValue("providerName2");
  pout +="---  
 "+g1+"  
"+g2;

 //Grab previous request to do req processing if required
 HttpServletRequest nrequest=(HttpServletRequest)firstOne.getAttribute("SharedRequest");

//retrieve vector
Vector goo= (Vector)firstOne.getAttribute("MYVECTOR");
 if (goo.size()>0) {
  for (int a=0; a";

  }
 }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X