Internet explorer 8 如何检测同一页面已在IE的另一个窗口中打开

Internet explorer 8 如何检测同一页面已在IE的另一个窗口中打开,internet-explorer-8,internet-explorer-7,internet-explorer,Internet Explorer 8,Internet Explorer 7,Internet Explorer,有没有办法检查我的页面没有在IE的其他选项卡或窗口中打开?假设我有Page1,用户点击“new window”(新窗口),它将打开一个新窗口,同时打开同一页面。现在有两个页面实例。我想限制浏览器在任何给定时间只打开一个页面实例 其中一个要求是,用户必须能够刷新页面,并且在应用程序中仍处于相同的状态。因此,一次性代币并不合适 我不确定是否有任何方法可以区分页面刷新和打开的新窗口,这就是我为什么要问的原因 另外,这不是一个普通的网站,我知道这样做通常是侵入性的和邪恶的。这是一个很好的例子,因为它是一

有没有办法检查我的页面没有在IE的其他选项卡或窗口中打开?假设我有Page1,用户点击“new window”(新窗口),它将打开一个新窗口,同时打开同一页面。现在有两个页面实例。我想限制浏览器在任何给定时间只打开一个页面实例

其中一个要求是,用户必须能够刷新页面,并且在应用程序中仍处于相同的状态。因此,一次性代币并不合适

我不确定是否有任何方法可以区分页面刷新和打开的新窗口,这就是我为什么要问的原因


另外,这不是一个普通的网站,我知道这样做通常是侵入性的和邪恶的。这是一个很好的例子,因为它是一个庞大的web应用程序。

我能想到的唯一方法是为每个页面创建一个cookie,标识页面及其访问时间,过期时间只有几秒钟或几分钟(根据口味调整),并在加载站点(或页面加载)时检查cookie是否存在

Psuedo代码:

if (cookie exists) {

Page already loaded in another tab/window.

}

else {

write cookie

}
可能的话,你可以使用某种形式的会话id,基于一些非唯一的东西。可能与用户的IP地址,用户名和盐?单独使用IP地址的缺点是路由器后面的所有用户共享同一地址,将其与用户名耦合的好处是,每个用户的IP地址至少是唯一的,salt用于基本的安全性(这对您来说可能不是那么重要,但似乎仍然是一种好的做法),并防止用户因为“打开了另一个窗口”而被锁定

如上所述,检查会话id是否存在,如果不存在,则创建会话id

正如@Spender所指出的,在对您的问题和另一个答案的评论中,任何实现此功能的解决方案都至少存在一个问题,即不允许用户刷新页面。短时间的cookie至少可以缓解这种情况,但不会让用户感到不快


编辑:

为了处理页面刷新的需要,我想您可以使用
onUnload
(或jQuery的
.unload
)来销毁cookie,以便用户离开/刷新页面时删除cookie


运行
onUnload
的js也可以通过Ajax或客户端的cookie来删除会话变量。

实现这一点的最佳方法是使用服务器端令牌(许多银行都这样做),该令牌在每次请求时重新生成,并且必须传回页面才能正常工作

所以基本上:

  • 将生成的令牌附加到每个 链接(作为查询字符串的一部分)
  • 您收到的任何不包含令牌的请求都可能被视为无效
  • 在每个请求时生成一个新令牌,以便在任何时间只有一个令牌有效

  • 简单的方法是使用windowName

    window.open(windowURL, windowName, windowFeatures); 
    
    将其指定为唯一,并在单击链接时进行检查,以确保该链接尚未打开


    这家伙解释得很好

    …其他浏览器呢?“我想限制浏览器在任何给定时间只打开一个页面实例”这种相当笨拙和不直观的行为想要解决什么特殊问题?当然有更好的方法吗?我同意斯宾德的观点,这似乎太过分了。事实上,有很多人不太了解标签式浏览,甚至不知道他们是否已经在同一页面上打开了另一个标签:他们将做什么?…或者更小的(但可能更大声)大量使用选项卡式浏览并且不希望对其浏览工作流施加不必要的限制的人数。这是针对web应用程序的,在web应用程序中,不希望自动打开另一个大规模应用程序实例。其他浏览器默认不会这样做。我只是刷新了页面。如果您在document.load上生成一个令牌,那么这实际上是有意义的。我们不断地发送请求,因此我们可以检测来自同一用户的请求,但使用两个不同的令牌,并以重定向到其中一个令牌的方式进行回复。@spender good point:)如果此技术需要与页面刷新兼容,您只需保持当前页面的令牌仅对该页面有效即可。