【问题标题】:How to detect that the same page is already opened in another window in IE如何检测同一页面是否已在 IE 的另一个窗口中打开
【发布时间】:2011-02-08 04:00:49
【问题描述】:

有什么方法可以检查我的页面没有在 IE 的另一个选项卡或窗口中打开吗?假设我有 Page1 并且用户点击“新窗口”,这将打开一个打开相同页面的新窗口。所以现在有两个页面实例。我想限制浏览器在任何给定时间只打开一个页面实例。

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

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

附:这不适用于普通网站,而且我知道这样做通常会具有侵入性和邪恶性。这里有充分的理由这样做,因为它是一个庞大的 Web 应用程序。

【问题讨论】:

  • ...其他浏览器呢?
  • “我想限制浏览器在任何给定时间只打开一个页面实例” 这种相当尴尬和不直观的行为要解决什么特别的问题?肯定有更好的方法吗?
  • 我同意 spender 的观点,这似乎非常具有侵入性。实际上,有相当多的人对标签式浏览了解得不够透彻,甚至知道他们是否已经在同一页面上打开了另一个标签:他们要做什么?
  • ...或少数人(但可能更直言不讳)大量使用选项卡式浏览并且不喜欢对其浏览工作流程施加不必要的限制。
  • 这是针对Web应用程序的,它不会自动打开另一个海量应用程序的实例。其他浏览器默认不这样做。

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


【解决方案1】:

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

伪代码:

if (cookie exists) {

Page already loaded in another tab/window.

}

else {

write cookie

}

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

如上,检查session id是否存在,如果不存在,则创建它。

正如@Spender 所指出的,在您的问题和另一个答案的 cmets 中,任何实现这一点的解决方案都至少存在一个问题,即不允许人们刷新页面。短暂的 cookie 时间至少可以缓解这种情况,但不会以一种不会阻止用户可能被激怒的方式。


已编辑:

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

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

【讨论】:

    【解决方案2】:

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

    所以基本上:

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

    【讨论】:

    • 我刚刚刷新了页面。哎呀。
    • 如果您在 document.load 上生成一个令牌,这实际上是有意义的。我们不断发送请求,因此我们可以检测到来自同一用户的请求,但使用 2 个不同的令牌,并通过重定向到其中一个进行回复。
    • @spender 好点 :) 如果此技术需要与页面刷新兼容,您可以简单地保持当前页面的令牌仅对该页面有效。
    【解决方案3】:

    简单的方法是使用 windowName

    window.open(windowURL, windowName, windowFeatures); 
    

    为其分配唯一的东西,并在单击链接时检查它以确保尚未打开。

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

    【讨论】:

      猜你喜欢
      • 2015-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-28
      • 2012-07-07
      • 1970-01-01
      • 2018-11-27
      相关资源
      最近更新 更多