0

我在当前项目中遇到了一个奇怪的问题:

我在 Glassfish 3.1 服务器上部署了多个基于 Spring MVC 的 Web 应用程序——我需要能够根据用户各自 web.xml 中的“会话超时”参数“超时”用户——无论在哪个应用程序中用户开启。请不要问为什么应用程序在单独的 WAR 中——架构就是这样。用户通过 WebApp A 登录并被重定向到 WebApp B - 然后用户可以继续跳转到不同的 Web 应用程序 - 我想你明白了。WebAppB 等也有许多 Ajax 调用(我什至不去那里)。我想,这个问题归结为我无法在 WebApp A 和 WebApp B 之间共享会话数据(我可能在这里错了——这是我需要帮助的地方),所以我没有任何通过检查知道的方法

httpServletRequest.getSession(false)  

在 WebAppB 中,因为它在第一个请求命中 WebAppB 和第一个请求“在”会话超时“之后”的两种情况下都返回 null。我必须在 WebAppA 的会话中保留“某些东西”并检查它在 WebAppB 的会话中是否存在——这让我回到了在 Web 应用程序中共享会话数据的问题。我不能使用数据库存储,因为这意味着每个请求都会调用数据库。我通过谷歌搜索 Tomcat 中的“crossContext”东西在这种情况下有帮助得到了一个方向 - 但这样的东西在 Glassfish 中会有帮助(我最近发现 sun-web-app.xml 有一个“crossContextAllowed”属性)。

我已经被这个问题困扰了很长一段时间了,我什至不确定这是一个值得你花时间的问题——所以在此先感谢你的帮助。

特里舒尔

4

1 回答 1

1

我无法帮助您实现 Glassfish,但您需要的是一种 Web 应用程序之间的单点登录形式。

要实现这种形式的 SSO,您通常需要做两件事:

  1. 确保您的所有 webapps 共享一个公共根上下文,即 webapp A 在 /commonroot/webappA 上,而 webapp B 在 /commonroot/webappB 上。这样做的原因是,当用户在它们之间切换时,必须将相同的会话 Id 传递给两个 webapp。会话 ID 通常存储在 cookie 中,浏览器根据路径传递 cookie。Glassfish 上必须有一个设置(就像在 Tomcat 和 Jetty 上一样),它可以“强制”webapp A 在路径“/commonroot”(而不是 /commonroot/webappA)和 webappB 上提供 cookie 来做同样的事情。然后,对 webapp A 或 webapp B 的任何访问都将从与 /commonRoot 路径关联的 cookie 中提取并提供唯一的会话 ID。
  2. 一旦您在同一个“SSO 上下文”中的所有 Web 应用程序为用户共享一个公共会话,您需要让这些 Web 应用程序从一个公共的、唯一的商店访问该会话。DB 是一种常用的方法,但如果您正在寻找速度,则 memcached 或 hazelcast 之类的东西可能更合适。使用 DB 的优势在于它还提供了会话持久性:如果您的会话存储被退回,使用未过期会话进行呼叫的用户将透明地重新连接,而无需再次登录。

Servlet/JavaEE 容器通常会提供 SSO 领域/会话管理器或等效的示例,它们将直接实现您的需求,或者您可以根据自己的需要进行微调。

于 2012-04-30T09:27:57.940 回答