12

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

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

这感觉非常低效。当用户刷新页面时,它也表现不佳。(这需要不到 2 秒)。我已经将 2 秒的检查时间比 keepalive 调用长,以允许较慢的连接。

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

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

4

4 回答 4

3

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

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

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

编辑:

* 有window.namejs属性,可以作为window id使用,不需要传过来。

于 2013-10-11T08:02:14.197 回答
3

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

sql 更新应如下所示:

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

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

于 2013-10-11T12:49:26.517 回答
1

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

似乎这是唯一的方法。

于 2013-10-11T07:58:38.587 回答
1

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

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

于 2013-10-11T07:58:59.260 回答