我似乎在 Jetty 7 中的作用域处理程序中遇到了一个奇怪的问题。我想要实现的是拥有单个身份验证页面(和单个 session ),它可以保护多个 WebAppContext
。在我看来,明智的解决方案是将所有 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
,因为 session 处理程序是最外层的作用域。问题是 ContextHandlerCollection
不是作用域处理程序,因此 nextScope
设置为第一个 ServletContextHandler
!不可能在第二个 ServletContextHandler
上调用 doScope
。
但是,即使第一个 servlet 也无法访问。调用 ServletHandler
中的 doScope
,并最终在外部作用域( session 处理程序)上调用 doHandle
,并将 target
设置为 /
。但是: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);
但我猜你当时已经自己弄清楚了......
再见
关于java - 全局 session +身份验证,Jetty中的多个上下文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32376104/