2009-10-28 16 views
8

Ok to jest problemobiekt Udostępnianie sesji między różnymi aplikacjami WWW

Mam aplikacji Java działa na szczycie Apache Tomcat & Mam ten z innej aplikacji za własny plik war działa na tym samym serwerze.

Teraz chcę uwierzytelnić użytkownika po przekazaniu tej sesji do innej aplikacji.

Możemy powiedzieć, że udostępnianie sesji w domenach na tym samym serwerze Apache Tomcat ... jak mam to zrobić ...?

Dziękuję

+0

Czy chcesz przekazać fakt uwierzytelnienia lub zawartość sesji? – Yishai

+0

wypróbuj OpenSSO dla bardziej ogólnego rozwiązania – IAdapter

+0

zobacz także: http://stackoverflow.com/questions/665941/any-way-to-share-session-state-between-different-applications-in-tomcat –

Odpowiedz

4

Stwórz unikalny token sesji i umieścić w tabeli w db, że obie aplikacje dostępu.
Przechowuj token w pliku cookie użytkownika.
Pozwala to uniknąć problemu z dzieleniem sesji i jest również bardziej skalowalne.

+0

A w jaki sposób zamierzasz uwierzytelnić się w drugiej aplikacji przy użyciu tego podejścia - poprzez złoenie żądania do 'j_security_check'? To nie wydaje się być czyste. Proszę również opracować "bardziej skalowalne". – ChssPly76

+0

Obie aplikacje używają tokena z pliku cookie do przeglądania sesji użytkownika we wspólnej bazie danych. Synchronizacja stanu między serwerami nie jest tak skalowalna jak serwery bezstanowe. Stan sesji powinien znajdować się w pliku cookie i bazie danych. – thethinman

+0

Nie mówię o stanie sesji. W jaki sposób ** uwierzytelnisz ** swojego użytkownika? Kto ustawi zleceniodawcę, co się stanie z deklaratywnym zabezpieczeniem itp. – ChssPly76

3

Tomcat zapewnia Single Sign On funkcjonalności poprzez zawór określonym terminie Host elementu w konfiguracji serwera Tomcat:

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

Istnieją pewne ograniczenia stosowane, spójrz na link powyżej (przewiń do Single Sign On sekcja) dla Detale.

1

Oto jak można zakodować go robiłem go dla innego kawałka pracy pracuję nad ....

Pierwsza zmiana

/etc/tomcatx/server.xml

dla każdego związku, który wymaga, aby być dzielone

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

Dodaj crossContext = true tag do każdego kontekstu teraz kodu do tworzenia i wysyłania informacji sesji wspólna

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

Kod zmieniać to ..

 
//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"; } }
Powiązane problemy