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

时间:2012-04-30 05:51:55

标签: session web-applications spring-mvc timeout

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

我在Glassfish 3.1服务器上部署了多个基于Spring MVC的Web应用程序 - 我需要能够根据各自web.xml中的“sesion timeout”参数“超时”用户 - 无论是用户所在的应用程序。请不要问为什么应用程序在单独的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”属性)。

我已经坚持了很长一段时间了,我甚至不确定这是一个值得你花时间的问题 - 所以提前感谢你们提供帮助。

特里舒尔

1 个答案:

答案 0 :(得分:1)

我无法帮助您实现Glassfish,但您需要的是webapps之间的单点登录形式。

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

  1. 确保您的所有Web应用程序共享一个公共根上下文,即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应用程序从一个共同的,独特的商店访问该会话。数据库是一种常用的方法,但如果你正在寻找速度,像memcached或hazelcast这样的东西可能更合适。使用数据库的优势在于它还提供会话持久性:如果您的会话存储被退回,那么使用未过期的会话进行呼叫的用户将被透明地重新连接而无需再次登录。
  3. Servlet / JavaEE容器通常提供SSO Realms / SessionManagers或同等产品的样本,这些样本将直接实现您的需求,或者您可以根据需要进行微调。