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

时间:2013-10-11 07:52:57

标签: javascript php jquery ajax

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

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

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

Q)我是以正确的方式进行此操作还是有更简单的方法来执行此操作?我听说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.

我已经尝试了一些解决方案here,但警告较新的标签,而不是较旧的标签似乎是在减少延迟/时间方面的棘手部分。

4 个答案:

答案 0 :(得分:3)

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

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

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

编辑:

*有window.name js属性,您可以将其用作窗口ID,而不需要传递它。

答案 1 :(得分:3)

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

sql update应如下所示:

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

然后检查受影响的行,如果它为0,则有一个concurent更新。这样你就不会遇到竞争条件。

答案 2 :(得分:1)

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

似乎这是唯一的方式。

答案 3 :(得分:1)

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

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