2015-09-03 2 views
1

Кажется, у меня запуталась странная проблема с обработчиками областей в Jetty 7. То, что я хочу достичь, - это иметь одну страницу аутентификации (и один сеанс), которая защищает несколько WebAppContext s. Разумное решение показало мне, что все webapps в ContextHandlerCollection и обернуть это в SecurityHandler и SessionHandler. Однако, глядя на код Jetty, мне кажется, что это никогда не сработает. Следующий код демонстрирует основную проблему:Глобальная сессия + аутентификация, несколько контекстов в Jetty

Server server = new Server(8000); 

SimpleServlet h1 = new SimpleServlet("Servlet 1"); 
SimpleServlet h2 = new SimpleServlet("Servlet 2"); 

ServletContextHandler c1 = new ServletContextHandler(); 
ServletContextHandler c2 = new ServletContextHandler(); 

c1.addServlet(new ServletHolder(h1), "/"); 
c2.addServlet(new ServletHolder(h2), "/"); 

c1.setContextPath("/context1"); 
c2.setContextPath("/context2"); 

ContextHandlerCollection chc = new ContextHandlerCollection(); 
chc.setHandlers(new Handler[]{c1, c2}); 

SessionHandler sh = new SessionHandler(); 
sh.setHandler(chc); 

server.setHandler(sh); 

Когда приходит запрос, это заканчивается в handle в SessionHandler. Здесь вызывается doScope, поскольку обработчик сеанса является самой внешней областью. Проблема в том, что ContextHandlerCollection не является обработчиком с областями, поэтому nextScope настроен на первое ServletContextHandler! Нет никакого способа, чтобы doScope когда-либо вызывался на второй ServletContextHandler.

Но даже этот первый сервлет недоступен. doScope в ServletHandler вызывается и заканчивается вызовом doHandle на внешней области (обработчик сеанса) с target, установленным на /. Но: ContextHandlerCollection не знает контекста под названием /, поэтому результат равен 404.

Что мне здесь не хватает?

+1

ли вы найти решение ? Я пытаюсь построить ту же топологию «глобальной сессии». – Ramazan

ответ

0

Если я правильно Вас понял, я думаю, это должно работать:

Server server = new Server(8000); 

SimpleServlet h1 = new SimpleServlet("Servlet 1"); 
SimpleServlet h2 = new SimpleServlet("Servlet 2"); 

ServletContextHandler c = new ServletContextHandler(); 
c.setContextPath("/"); 
c.addServlet(new ServletHolder(h1), "/context1"); 
c.addServlet(new ServletHolder(h2), "/context2"); 

SessionHandler sh = new SessionHandler(); 
sh.setHandler(c); 

server.setHandler(sh); 

Но я думаю, вы поняли это сами к тому времени ...

Bye

Смежные вопросы