Language agnostic 阻止同一服务器会话上的多个浏览器会话

Language agnostic 阻止同一服务器会话上的多个浏览器会话,language-agnostic,session,Language Agnostic,Session,我敢肯定,我们都已经研究过或意识到web应用程序(尤其是在企业中)将自己紧密地绑定到服务器会话。在这些情况下,如果打开多个浏览器会话并使用同一服务器会话cookie,则会话可能会损坏。我们已经检查了所有选项,并发现最好的前进方式是不鼓励使用共享服务器会话cookie的多个浏览器会话 只有当用户在IE中执行newwindow-Ctrl+N或在其他浏览器中执行与“复制选项卡”等效的操作时,这才是真正的问题。基本上,我们最终得到了两个共享相同cookie的活动浏览器会话 所以,为了阻止这种行为(因为这

我敢肯定,我们都已经研究过或意识到web应用程序(尤其是在企业中)将自己紧密地绑定到服务器会话。在这些情况下,如果打开多个浏览器会话并使用同一服务器会话cookie,则会话可能会损坏。我们已经检查了所有选项,并发现最好的前进方式是不鼓励使用共享服务器会话cookie的多个浏览器会话

只有当用户在IE中执行
newwindow-Ctrl+N
或在其他浏览器中执行与“复制选项卡”等效的操作时,这才是真正的问题。基本上,我们最终得到了两个共享相同cookie的活动浏览器会话

所以,为了阻止这种行为(因为这可能是无意的),我已经开始设置某种警告系统来防止这种行为。现在,我们的代码进行了大量的并发检查以确保数据完整性,但仍然可能存在数据损坏问题

我的解决方案是,在发现一般的答案是“不可能”之后,依靠AJAX发送“ping”并测量两者之间的时间间隔。因此,我们有一个一般规则:我们以一定的间隔“ping”,如果当前ping中最后一次ping之间的差值小于ping持续时间,我们知道在单个服务器会话上有多个活动浏览器会话

因此,
Pf
是ping频率
Pc
为当前ping;而
Pl
是最后一次ping,那么我们在
Pf>(Pc-Pl)
时出现了一个错误

p1 p2 p3 p4 表10-------------------------------------表。。。 : : : :p1:p2:p3 p4 表2 0-----------------------------------------表。。。 ^ ^ ^ ^ ^ ^ ^ ^ 三角洲 ----+---+------------ 表| P |三角洲(Pc-Pl) ----+---+------------ 1 | 1 | 5 1 | 2 | 5 2 | 1 | 2.5-错误 1 | 3 | 2.5-错误 2 | 2 | 2.5-错误 现在,如果存在网络拥塞或其他因素,那么增量将大于频率,排除误报

如果两个选项卡在完全相同的时刻打开,我们确实会遇到问题。但是,由于ping频率只是发出请求的频率,而不是保证经过的时间,我们可以假设很快两个浏览器会话将开始失去同步

在本例中,我将ping频率设置为每5秒一次。如果同时有100个用户,那么ping Servlet/HttpModule的请求数大约为每秒20个。为了尽量减少不必要的网络流量,我认为ping频率会随着时间的推移而衰减,直到达到每秒20 ping的最大值。对于100个并发用户,这将达到每秒约5个请求。不过,这是一种权衡,因为它会导致检测延迟。但是,一旦发生检测,频率将重置为5 pings/s,直到解决。(这些数字只是一个例子;它们会根据环境的不同而有所不同)

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

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


<强>编辑:我知道这听起来像一个创可贴,但这意味着是一个临时措施,直到我们可以撕掉冒犯的图书馆。

< P>我的主要担心是当网络延迟时,这是否会受到损害。也就是说,任何问题都可能来自首先通常使用ping处理的问题。

如果您确实处于困境,无法修复应用程序以正常处理共享同一会话的多个浏览器实例,那么是的,这是一种合理的方法

值得一提的是,我使用了完全相同的概念来强制执行并发使用许可证约束——因此它将检测到多个用户共享相同的“密钥”,在您的情况下,这就是会话


我只想稍微修改一下您的方法,让ping消息包含客户端的日期/时间,这样您就可以在计算中完全避免处理网络延迟。

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

就我个人而言,我不喜欢ping探测器的声音。我只想确保永远不会发生数据损坏。多个浏览器会话不是这样做的有效借口。。。虽然我知道这会有什么问题。但是,如果您想在完美工作的代码之上添加ping检测器,那么它可能会对用户起到有用的提醒作用

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

它的缺点是:修复应用程序,使其不损坏任何数据。我知道这可能不是一件小事,我不想轻视它。实现ping等可能有助于解决问题,但我保证 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
function CheckMultipleSession() {
var existingCookieValue = getCookie("MySessionCookie");
if (existingCookieValue == null) { //first request so create cookie
   currentCookieValue = guid();
   setCookie("SessionGUID", currentCookieValue); 
   window.name = currentCookieValue; // setting DOM window name (this is key)
}
else {
if (existingCookieValue != window.name)
   top.location = "MultipleSessionsError.htm";                                       
}
}