2

我正在开发的 Jetty 9 应用程序会自动扫描一组 JarFiles 以获取 web.xml,然后以编程方式将包含的 webapps 导入为 WebAppContexts。我需要在各个 webapps 之间实现单点登录,如以下 Jetty 6 教程中所述:http: //docs.codehaus.org/display/JETTY/Single+Sign+On+-+Jetty+HashSSORealm。不幸的是,HashSSORealm 似乎已从 Jetty 中删除。是否有任何可行的替代方案来实施简单的 SSO?

我确实发现这篇文章推荐了 Fediz 码头插件,但如果存在这种情况,我更愿意使用原生码头解决方案:http: //dev.eclipse.org/mhonarc/lists/jetty-users/msg03176.html

更多信息:

中心问题似乎是每个 WebAppContext 都必须有自己的 SessionManager,这使得 WebAppContexts 即使使用相同的 cookie 也无法相互共享信息。

4

2 回答 2

2

我解决了这个问题——您只需将相同的 SessionManager 实例分配给每个 WebAappContext 的 SessionManager。它看起来有点像这样,假设所有 WebAppContexts 都分组在 /webapps/ 上下文路径下:

 // To be passed to all scanned webapps. Ensures SSO between contexts
SessionManager sessManager = new HashSessionManager();
SessionCookieConfig config = sessManager.getSessionCookieConfig();
config.setPath("/webapps/"); // Ensures all webapps share the same cookie

// Create the Handler (a.k.a the WebAppContext).
App app = new App(deployer, provider, module.getFile().getAbsolutePath());
WebAppContext handler = (WebAppContext)app.getContextHandler(); // getContextHandler does the extraction
// Consolidating all scanned webapps under a single context path allows SSO
handler.setContextPath("/webapps" + handler.getContextPath());
// Cookies need to be shared between webapps for SSO
SessionHandler sessHandler = handler.getSessionHandler();
sessHandler.setSessionManager(sessManager);
于 2013-10-24T11:43:21.107 回答
1

如果您跨 WebAppContexts 共享 SessionManager,那么所有这些 WebAppContexts 共享完全相同的会话实例。Servlet 规范说 WebAppContexts 应该共享会话 ID,而不是会话内容。

于 2013-10-24T22:06:24.157 回答