现在我们正在开发一个大型应用程序,其中模块被部署为单个 .EAR 文件(每个文件包含一个 .WAR 和一个 EJB 。 jar )。
我们在 GlassFish 3.1 中配置应用程序以使用 JAAS 进行单点登录。因此,我们需要在 SSO session 处于 Activity 状态时保持每个 Web 模块 session 处于 Activity 状态。
例如:模块 A
、B
和 C
部署了 10 分钟的 session 。用户使用 A
登录,然后可以导航到 B
和 C
,并在 C< 上花费(假设)20 分钟
.
想法是当用户只使用 C
时,我们必须在 A
和 B
上保持他的 session (包括托管 beans) >.
什么可以帮助我们实现这一目标?一个想法是在每个模块上创建一个 servlet 来接触 session (从而使它保持 Activity 状态),并从用户正在使用的模块向这些 servlet 发送异步(可能是单向的?)请求,但这似乎有点矫枉过正每次用户做某事时打开 HTTP 连接(通过 TCP)。或许轮询会有所帮助,但我们希望避免这种沟通方式。
另一个想法是使用共享内存缓存和缓存监听器来访问其他 session ,使用 session ID 进行查找;这可以达到更好的性能吗?
我们对任何想法持开放态度...除了使用其他应用程序服务器(我们必须使用 OpenSource GlassFish - 没有 Coherence*Web)。
感谢您的宝贵时间。
最佳答案
您需要 JAAS 吗?您可以使用 spring-security 和 session ID 的支持 redis 缓存来实现解决方案。所以例如当用户在 A
上登录时, session ID 被放入 redis 缓存中,当用户通过将 session ID 作为查询传递的链接导航到 B
时参数,spring 安全层(在 B
上)将确保 session-id 在 redis 缓存中是有效的。 Redis 内置了对过期数据的支持
这是一篇好文章:http://www.infoq.com/minibooks/Identity-Management-Shoestring关于构建中央身份验证服务 (CAS)。
希望对你有帮助
关于java - 在同一个 glassfish 实例中保持多个 session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12431446/