如何检测IE中的另一个窗口中已经打开了同一页面

时间:2010-04-14 23:45:56

标签: internet-explorer-8 internet-explorer-7 internet-explorer

有没有办法检查我的页面是否未在IE中的另一个标签页或窗口中打开?假设我有Page1,用户点击“新窗口”,这将打开一个打开同一页面的新窗口。所以现在页面有两个实例。我想限制浏览器在任何给定时间只打开一个页面实例。

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

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

P.S。这不是一个普通的网站,我明白这样做通常是侵入性和邪恶的。这里有一个强有力的案例,因为它是一个庞大的Web应用程序。

3 个答案:

答案 0 :(得分:4)

实现这一点的最佳方法是让服务器端令牌(许多银行执行此操作)在每次请求时重新生成,并且必须将其传回以使页面正常运行。

基本上是这样的:

  1. 您可以为每个附加生成的令牌 link(作为查询字符串的一部分)
  2. 您收到的任何不包含令牌的请求都可视为无效。
  3. 在每个请求中生成一个新令牌,以便任何时候只有一个令牌有效

答案 1 :(得分:2)

简单的方法是使用windowName

window.open(windowURL, windowName, windowFeatures); 

为其指定一些独特的,并在点击链接时检查它以确保尚未打开。

这家伙解释说它真的很好。 - http://www.joemarini.com/tutorials/tutorialpages/window1.php

答案 2 :(得分:0)

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

伪代码:

if (cookie exists) {

Page already loaded in another tab/window.

}

else {

write cookie

}

Possiby你可以使用某种形式的会话ID,基于非独特的东西。也许用户的IP地址,用户名和盐?单独使用IP地址的缺点是路由器共享相同地址后面的所有用户,将其与用户名耦合的好处是,它至少是每用户唯一的,并且盐用于基本安全(可能不是全部对你来说很重要,但它似乎仍然是一种很好的做法),并防止用户被锁定,因为他们已经在某个地方打开了另一个窗口。

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

正如@Spender所述,在对你的问题的评论和另一个答案中,任何实现这一点的解决方案都至少存在一个不允许人们刷新页面的问题。哪个短暂的cookie时间至少可以缓解,但不会以不会阻止用户可能受到激怒的方式进行。

<小时/> 的编辑:

为了满足页面刷新的需要,我猜你可以使用onUnload(或jQuery的.unload)来破坏cookie,这样就可以删除用户离开/刷新页面

运行onUnload的js也可用于通过Ajax删除会话变量,或仅用于客户端的cookie。