gpt4 book ai didi

java - 全局 session +身份验证,Jetty中的多个上下文

转载 作者:太空宇宙 更新时间:2023-11-04 13:28:56 25 4
gpt4 key购买 nike

我似乎在 Jetty 7 中的作用域处理程序中遇到了一个奇怪的问题。我想要实现的是拥有单个身份验证页面(和单个 session ),它可以保护多个 WebAppContext 。在我看来,明智的解决方案是将所有 Web 应用程序放入 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);

当请求传入时,最终会到达 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com