Session 会话超时和多个Web应用程序

Session 会话超时和多个Web应用程序,session,web-applications,spring-mvc,timeout,Session,Web Applications,Spring Mvc,Timeout,在我当前的项目中,我面临一个奇怪的问题: 我在Glassfish 3.1服务器上部署了多个基于Spring MVC的web应用程序,并且我需要能够根据各自web.xml中的“sesion timeout”参数为用户“超时”,无论用户在哪个应用程序上。请不要问为什么应用程序处于不同的战争中——架构就是这样。用户通过WebApp A登录,并被重定向到WebApp B-然后用户可以继续跳转到不同的web应用-我想你明白了。WebAppB等也有很多Ajax调用(我甚至不打算去那里)。我想,问题归结为我无

在我当前的项目中,我面临一个奇怪的问题:

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

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

我已经被这个问题困扰了很长一段时间了,我甚至不确定这个问题是否值得你花时间回答——所以提前感谢你的帮助


Trishul

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

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

  • 确保所有webapp共享一个公共根上下文,即webapp a打开/commonroot/webappA,webapp B打开/commonroot/webappB。原因是,当用户在两个webapp之间切换时,必须将相同的会话Id传递给这两个webapp。会话ID通常存储在cookie中,浏览器根据路径传递cookie。Glassfish上必须有一个设置(就像Tomcat和Jetty上的设置一样),可以“强制”webapp a在路径“/commonroot”(而不是/commonroot/webappA)上发送cookie,webappB也可以这样做。然后,对webapp A或webapp B的任何访问都将从与/commonRoot路径关联的cookie中提取并提供唯一的会话id
  • 一旦您让同一“SSO上下文”中的所有Web应用共享一个用户的公共会话,您就需要让这些Web应用从一个公共的、唯一的存储访问该会话。DB是一种常用的方法,但如果您希望提高速度,那么像memcached或hazelcast这样的方法可能更合适。使用DB的优点是它还提供会话持久性:如果会话存储被跳转,则使用未过期会话进行呼叫的用户将透明地重新连接,而无需再次登录

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

    感谢BGR的回复。我会再等几个小时,看看有没有人回复。否则我会把你的标记为正确。再次感谢。