全局会话+身份验证,Jetty中的多个上下文

时间:2015-09-03 12:47:09

标签: java jetty

我似乎遇到了Jetty 7中的作用域处理程序的奇怪问题。我想要实现的是拥有一个身份验证页面(和一个会话),它可以保护多个WebAppContext。在我看来,明智的解决方案是将所有的webapp放在ContextHandlerCollection中,并将其包含在SecurityHandlerSessionHandler中。但是,看看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被调用,并最终在外部作用域(会话处理程序)上调用ServletHandlerdoHandle设置为target。但是:/不知道名为ContextHandlerCollection的上下文,因此结果为404.

我在这里缺少什么?

1 个答案:

答案 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);

但我猜你当时想出来了......

再见