检测是否对同一站点打开了两个浏览器窗口


Detect if two browser windows are open to the same site

我正在尝试检测用户是否在一个选项卡中打开了我的网站,然后在另一个选项卡中打开了它。然后,这应该在新打开的选项卡上向用户显示警告。

现在,我每秒向服务器发送一个"保持活动"的ajax调用。然后,这会使用唯一 ID 记录数据库中的"上次活动"时间。加载新页面时,它会检查该用户(由用户 ID 标识)在过去 2 秒内是否处于活动状态。

这感觉效率很低。当用户刷新页面时,它的性能也不好。(所需时间不到 2 秒)。我使 2 秒检查比保持连接调用更长,以允许较慢的连接。

问:我这样做的方式是否正确,还是有更简单的方法?我听说Gmail和Facebook可能会做类似的事情,但我找不到他们这样做的网站功能。


实际代码使用许多内部函数,因此以下是一般思路:

伪代码:

Page load;
[index] PHP: Save tabsessionid, userid, datecreated, lastactive, phpsessionid into database;
[index] JS: Every second, send tabsessionid to keepalive.php
[keepalive] PHP: Check if another session exists in the last 2 seconds
[keepalive] PHP:        If exists -> Return "-1"; else -> return "1";
[keepalive] PHP: Update tabsessionid's last active time.

我在这里尝试了一些解决方案,但警告较新的选项卡,而不是旧的选项卡似乎是降低延迟/时间方面的棘手部分。

您应该保留内容的版本,最初为 1,每次提交的编辑都会增加。提交的编辑必须包含版本号,该版本号与当前版本号进行比较,如果不匹配,则编辑将被拒绝。也可以进行 ajax 调用以请求当前版本,并警告用户他的版本已过时。

sql 更新应如下所示:

UPDATE table SET .... WHERE id = :id AND version = :version

然后检查受影响的行,如果为 0,则有并发更新。这样,您就不会遇到争用条件。

这只是你必须努力的一个想法:

JavaScript 变量是

选项卡的本地变量,cookie 是常见的。您可以为每个选项卡提供一个 ID,并在链接和表单中传递它*。如果一个选项卡发现它没有设置和 ID,并且设置了活动选项卡 ID,它可以使用另一个 cookie 来询问是否还有带有此 ID 的选项卡,或者已关闭(当然,它必须定期检查此"询问"cookie 和答案)。确切的实现取决于您要执行的操作。

我希望我解释清楚了自己。

编辑:

*有window.name js属性,你可以把它用作窗口ID,你不需要传递它。

我认为您应该使用参数从每个窗口向服务器发送数据(可能是简单的 HEAD 请求),包含用户 uid 和窗口 ID(在页面加载时随机生成一次),并检查是否存在具有多个窗口 ID 的相同 uid;

似乎这是唯一的方法。

我应该说,无论您的问题是什么,这都是不合适的解决方案吗?

即使您找到了一个肮脏的解决方法来防止人们在您的网站上使用多个标签,您也不会击败隐身模式。如果您这样做,请帮忙并为该浏览器提交错误报告。