Совместное использование объекта сеанса между различными веб-приложениями - PullRequest
8 голосов
/ 28 октября 2009

Хорошо, это проблема

У меня есть приложение Java, работающее поверх Apache Tomcat, и у меня есть это другое приложение с собственным файлом war, работающим на том же сервере.

Теперь я хочу аутентифицировать пользователя один раз и передать этот сеанс другому приложению.

Можно сказать, междоменный общий доступ к сеансам на том же Apache Tomcat .. как мне это сделать ....?

Спасибо

Ответы [ 3 ]

4 голосов
/ 28 октября 2009

Создайте уникальный токен для сеанса и поместите в таблицу базы данных, к которой имеют доступ оба приложения. Сохраните токен в куки пользователя.
Это позволяет избежать проблемы совместного использования сеанса и также является более масштабируемым.

3 голосов
/ 28 октября 2009

Tomcat обеспечивает функцию единого входа через клапан, указанный в элементе Host в конфигурации Tomcat:

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

Существуют определенные ограничения, для получения подробной информации ознакомьтесь с приведенной выше ссылкой (выделите раздел «Единый вход»).

1 голос
/ 12 мая 2011

Вот как вы можете закодировать это, я делал это для другой части работы, над которой я работаю ....

Первое обновление

/ и т.д. / tomcatx / server.xml

Для каждого контекста, который требуется предоставить для общего доступа

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

Теперь добавьте тег crossContext = true в каждый контекст, чтобы код создавал и отправлял информацию общего сеанса

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

Код для его изменения ..

//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 +="---<br> "+g1+"<br>"+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";

  }
 } 

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...