防止同一服务器会话上的多个浏览器会话

Rya*_*rle 6 language-agnostic session

我确信我们已经完成了所有工作,或者知道已经紧密绑定到服务器会话的Web应用程序(特别是在企业中).在这些情况下,如果打开多个浏览器会话并使用相同的服务器会话cookie,则会话可能会损坏.我们已经检查了所有选项,发现前进的最佳方法是阻止使用共享服务器会话cookie的多个浏览器会话.

当用户New Window - Ctrl+N在IE中执行或在其他浏览器中相当于"重复选项卡"时,这只是一个问题.基本上我们最终会有两个共享相同cookie的活动浏览器会话.

因此,为了阻止这种情况(因为它可能是无意的),我已着手制定某种警告系统来防止这种行为.现在,我们的代码进行了大量的并发检查以确保数据完整性,但仍然存在数据损坏问题.

在找到一般答案"不可能"后,我的解决方案是依靠AJAX发出"ping"并测量之间的时间.因此,我们有一个通用规则:我们以一定的间隔"ping",如果当前ping中最后一次ping之间的增量小于 ping持续时间,我们就知道在一个服务器会话中有多个活动的浏览器会话.

那么,Pfping频率在哪里; Pc是当前的ping; 并且Pl是最后一次ping,然后我们有一个错误Pf > (Pc - Pl).

           p1    p2    p3    p4
TAB1 0-----|-----|-----|-----|---...
                 :     :     :
                 :  p1 :  p2 :  p3    p4
TAB2          0-----|-----|-----|-----|---...
     ^     ^     ^  ^  ^  ^  ^  ^
                  Deltas
----+---+------------
TAB | P |   Delta (Pc - Pl)
----+---+------------                 
 1  | 1 |   5
 1  | 2 |   5
 2  | 1 |   2.5 -Error
 1  | 3 |   2.5 -Error
 2  | 2 |   2.5 -Error

现在,如果存在网络拥塞或其他因素,那么增量将大于频率,排除误报.

如果两个标签在完全相同的momemnt处打开,我们确实遇到了问题.但是,由于ping频率只是发出请求的频率,而不是保证的经过时间,我们可以假设很快两个浏览器会话将开始滑动不同步.

在示例中,我将ping频率设置为每5秒.如果有100个并发用户,那么我们正在查看ping Servlet/HttpModule的~20个请求/秒.为了最大限度地减少不必要的网络流量,我认为ping频率会随着时间的推移而衰减,直到达到最大20 pings /秒.对于100个并发用户,这将达到约5个请求/秒.然而,这是一种权衡,因为它会导致检测延迟.但是,一旦发生检测,频率将重置为5次/秒,直至解决.(这些数字仅作为示例;它们会根据环境而变化)

为了最小化并发性和可伸缩性问题,会话的最后一个ping时间戳应保留在会话本身中.这将允许任何分布式会话技术在JVM或应用程序域之间维护会话的可用性,而我们的ping服务无需了解它.

我正试图确定这是否是一个合理的方法,如果我在一个受伤的世界.任何有关该问题的经验都会有所帮助.

编辑:我知道这听起来像是一个创可贴,但这是一个权宜之计,直到我们能够删除有问题的图书馆.

Mat*_*hew 2

许多年前,我曾开发过一个单窗口 Web 应用程序(早于“Web 2.0”)。我们只是启动了一个没有任何工具栏(没有后退按钮等)的新窗口,并禁用了右键单击。我们精心创建了一个非常有用的会话中导航系统。这足以防止几乎所有意外的重复浏览。这是一个内部网应用程序;显然我绝不会建议在一般网站上做这样的事情。

就我个人而言,我不喜欢 ping 检测器的声音。我只是确保永远不会发生数据损坏。多个浏览器会话并不是一个有效的借口......尽管我知道这可能会出现问题。但如果您想在完美工作的代码之上添加 ping 检测器,那么它可能会为用户提供有用的提醒。

您可以在每个链接的末尾添加一个唯一的标记。如果多次使用唯一令牌(例如,打开新窗口、添加书签、后退、前进),则该请求可能会被拒绝。通过正确的跟踪,您可以确保在不采取有效路径的情况下永远不可能从一个页面到达另一页面。这种方法比 ping 更可靠(因为它由服务器控制),但可能会导致非常烦人的用户体验。

其缺点是:修复您的应用程序以不损坏任何数据。我知道这可能不是一件小事,我也无意轻视它。实施 ping 之类的操作可能有助于解决问题,但我向您保证,如果出现问题,最终一定会出现问题。:-)