我似乎遇到了Jetty 7中的作用域处理程序的奇怪问题。我想要实现的是拥有一个身份验证页面(和一个会话),它可以保护多个WebAppContext
。在我看来,明智的解决方案是将所有的webapp放在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);
当请求进入时,最终会在handle
的{{1}}中结束。这里调用了SessionHandler
,因为会话处理程序是最外层的作用域。问题是doScope
不是范围处理程序,因此ContextHandlerCollection
设置为第一个nextScope
!在第二个ServletContextHandler
上无法调用doScope
。
但是,即使第一个servlet也无法访问。 ServletContextHandler
中的doScope
被调用,并最终在外部作用域(会话处理程序)上调用ServletHandler
,doHandle
设置为target
。但是:/
不知道名为ContextHandlerCollection
的上下文,因此结果为404.
我在这里缺少什么?
答案 0 :(得分: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);
但我猜你当时想出来了......
再见