Java 全球会议+;身份验证,Jetty中的多个上下文

Java 全球会议+;身份验证,Jetty中的多个上下文,java,jetty,Java,Jetty,我似乎在Jetty 7中遇到了一个奇怪的问题,即作用域处理程序。我想要实现的是拥有一个身份验证页面(和一个会话),它可以保护多个WebAppContexts。在我看来,明智的解决方案似乎是将所有Web应用程序放在ContextHandlerCollection中,并将其包装在SecurityHandler和SessionHandler中。然而,看看Jetty代码,在我看来,这永远无法正常工作。以下代码演示了核心问题: Server server = new Server(8000); Simp

我似乎在Jetty 7中遇到了一个奇怪的问题,即作用域处理程序。我想要实现的是拥有一个身份验证页面(和一个会话),它可以保护多个
WebAppContext
s。在我看来,明智的解决方案似乎是将所有Web应用程序放在
ContextHandlerCollection
中,并将其包装在
SecurityHandler
SessionHandler
中。然而,看看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);
当一个请求进入时,它会在
SessionHandler
中的
handle
中结束。这里调用了
doScope
,因为会话处理程序是最外层的作用域。问题是
ContextHandlerCollection
不是作用域处理程序,因此
nextScope
被设置为第一个
ServletContextHandler
!在第二个
ServletContextHandler
上不可能调用
doScope

但是,即使是第一个servlet也无法访问<调用
ServletHandler
中的code>doScope,最后调用外部作用域(会话处理程序)上的
doHandle
,并将
目标设置为
/
。但是:
ContextHandlerCollection
不知道名为
/
的上下文,因此结果是404


我在这里遗漏了什么?

如果我理解正确,我想这应该有用:

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);
但我想你自己也知道了


再见

如果我没弄错的话,我想这应该行得通:

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);
但我想你自己也知道了


再见

你找到解决办法了吗?我正在尝试构造相同的“全局会话”拓扑。您找到解决方案了吗?我试图构建相同的“全局会话”拓扑。