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

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

现在我每秒都会向服务器发送一个“保持活跃”的ajax呼叫。 然后,这将使用唯一ID记录数据库中的“最后活动”时间。 加载新页面时,它会检查该用户(由userID标识)是否在最近2秒内处于活动状态。

这感觉非常低效。 当用户刷新页面时,它也不能很好地执行。 (只需不到2秒钟)。 我做了2秒的检查比keepalive调用更长,以允许更慢的连接。

问)我是以正确的方式进行这种方式还是有更简单的方法来做到这一点? 我听说Gmail和Facebook可能会做类似的事情,但我找不到他们这样做的网站function。

实际代码使用了许多内部函数,所以这里是一般的想法:

伪代码:

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,则有一个concurent更新。 这样你就不会遇到竞争条件。

这只是你必须要做的一个想法:

javascript变量是选项卡的本地变量,cookie很常见。 您可以为每个标签指定一个ID,并在链接和表单中传递它*。 此ID将作为活动选项卡ID存储在cookie中。 如果一个标签发现它没有和id设置,并且设置了活动标签ID,它可以使用另一个cookie来询问是否仍然有这个标签带有此标识,或者已关闭(当然,它必须定期检查这个“问“cookies和答案”。 确切的实施取决于您想要做什么。

我希望我能清楚地解释清楚。

编辑:

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

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

似乎这是唯一的方法。

难道我说不管你的问题是什么都不合适?

即使您发现了一种肮脏的解决方法,以防止人们在您的网站上进行多重标记,您也无法超越隐身模式。 如果您这样做,请帮忙并为该浏览器提交错误报告。