检测用户离开页面的正确方法

Proper way to detect user's leaving page

我正在构建一个 WebApp (ERP),我需要在页面上显示当前登录和活动的人员。通过监听 mouse/keyboard 事件并定期向数据库报告,我设法获得了相当准确的信息。

我不知道如何在人们关闭页面时将他们标记为离线。我尝试使用 onbeforeunload,但当用户简单地更改页面时它显然会触发(单击 ERP 内的 link,它指向 ERP 中的另一个页面)。

然后我尝试使用 WebSockets,但问题是一样的:每次重新加载页面时,WebSockets 连接都会关闭。

所以我想到了两个办法:

那么,是否有正确、干净的方法来做到这一点?感谢您的帮助。

已经有人post这种问题了。

希望对您有所帮助。

Detect if user has closed ALL windows for a website?

如果您的每个页面都有到服务器的 webSocket 连接,那么在服务器上您可以通过查看 webSocket 关闭来了解任何给定页面何时关闭。

为了避免在用户刚刚从您网站的一个页面导航到另一个页面时认为他们已经离开了网站,您只需添加一个延迟服务器端,以便您只报告用户已经离开您的网站如果在一段时间内(可能至少几秒钟)没有来自该用户的 webSocket 连接,则站点。

因此,当您检测到该用户的最后一个 webSocket 连接已关闭时,您会在您的服务器上设置一个计时器,持续数秒。如果用户在计时器关闭之前打开您网站上的另一个页面(通过导航或只是打开另一个页面),您将取消计时器并将用户计为仍处于连接状态。如果计时器响起,那么您现在就知道用户在您选择的任何时间段内(比如 10 秒)都离开了您的网站,对您来说,这将表示他们已经离开了网站。您可以在决定之前控制您希望该时间段持续多长时间,是的,它们已经消失了。

所有试图 "see" 用户在 Javascript 离开您的页面在浏览器中的尝试都会有漏洞,因为网页总是有办法在没有您的情况下关闭客户端 javascript 有机会告诉您的服务器。 webSocket 解决方案的美妙之处在于浏览器会在页面消失时自动可靠地告诉您的服务器,因为它关闭了 webSocket 并且您的服务器收到套接字已关闭的通知。

据我了解,您想计算 website/pages 上的活跃用户数。

  1. 识别用户(计算出 99% 的唯一 ID): http://valve.github.io/blog/2013/07/14/anonymous-browser-fingerprinting/可以用别的库,很少。

  2. 在每个页面上不时在页面加载时发送意味着用户正在导航或(60 秒你可以选择更短的时间范围意味着用户正在页面上)计算的 id(指纹 js)到服务器(web-socket/ajax)

  3. 在服务器上,当新用户登录时(存储在数据库或会话中),您需要拥有带有到期日期(60 秒)增量的 ID 列表。

  4. 在您的网站上检索 id 的时间戳 <= 服务器时间的计数(60 秒 ajax/websocket)- 比如说 120 秒。

知道用户是否登录,并指定页面:

使用要在服务器发送的对象{指纹:123123124234,记录:true,页面:主页}

  1. 如果您没有在数据库中存储用户,请清除您的列表:

单独的线程(仅限服务器)访问该对象并销毁早于 10 分钟或您的页面会话设置的所有节点。

js 定时器:http://www.w3schools.com/jsref/met_win_setinterval.asp

希望对您有所帮助,如果用户仍在页面上或在页面加载时发出信号,id 会在 5 分钟后使用计时器发送到服务器。

获取用户在 60 秒帧内的持续时间。甚至页面上显示姓名的用户 :)