0

我正在使用 Spring acegi 安全性在多个应用程序上进行单点登录。如果用户也在浏览器上写东西,我需要在客户端延长会话超时。如果用户打开了多个会话或浏览器,那么我需要考虑他打开的所有会话的活动会话。如果他是活跃的,那么即使他在其他会话中不活跃,我也不应该注销他。请向我提出任何如何在客户端跟踪和了解的想法。

任何想法都非常受欢迎。谢谢你。

app1在两个选项卡中运行应用程序说tab1.Timeouttab2是 10 分钟。所以我们在客户端的java脚本中实现了超时功能。此代码在 10 分钟后给出确认框。如果用户说继续,我们将通过触发活动 url 来扩展会话。如果应用程序在单个选项卡中运行,则此方法有效。app1在多个选项卡中打开相同的应用程序说tab1tab2。此处应用程序 app1 在两个选项卡中打开,但在单个会话中打开。我们正在唤醒打开的应用程序, tab2而不是在tab1. 所以 tab1 中的应用程序在 10 分钟内处于非活动状态。然后应用程序在tab1给出确认框,我们不回答该确认框 tab2 将申请注销。那么当我们在 Tab2 上工作时不注销的解决方案是什么。有任何想法吗?如何跟踪应用程序是否在其他选项卡中处于活动状态?

4

3 回答 3

1

这不是直截了当的答案。(因为我认为没有解决方案)

您可以尝试在应用程序之间触发一个像素(*),从而延长会话时间。
假设你有:
app1,app2,app3

用户登录到 app1 和 app2,他只在 app1 上工作。如果您在他在 app1 上发出的每个 http 请求都从他的浏览器向 app2 发射一个像素,那么他认为他在 app 2 上也处于活动状态。
我认为,如果您在应用程序 app1、2 和 3 之间每 2 分钟触发一次像素,您可以在应用程序之间保存会话。

我已经在 PHP 应用程序中完成了这个 twick,它并不那么容易,但它是可行的。

*像素-它是在服务器端运行脚本的隐藏 http 请求。可以通过 ajax、img、script src=""、iframe 等来实现。

于 2011-04-03T05:50:18.650 回答
0

最简单的方法是将登录会话与共享域相关联。假设您有 app1.domain.com、app2.domain.com、app3.domain.com,但是您在 domain.com 上进行了 SSO,并且它们都共享该会话 cookie。这只是在会话cookie上设置域的问题——我相信你可以在配置中做到这一点。无论如何,这很容易做到,所以如果这适用于您的问题,那就去做吧。(也许在没有域层次结构的情况下有一些棘手的方法可以做到这一点,但我不确定它是什么。)

如果这不可行,您可能需要另一种方式来存储会话。我的第一个想法是将会话放入数据库中。有了这些,您可以同步和集中管理超时。这可能需要一些自定义代码——但不应该那么多。

不确定这是否适用,但我也写了关于在客户端实现超时的想法。

于 2011-04-03T06:20:47.293 回答
0

修改 javascript 中的代码以向服务器发送 ajax 请求并查找最新活动。如果最近的活动少于 10 分钟,则没有注销。

于 2011-06-07T23:09:13.130 回答