检测用户离开页面的正确方法
Proper way to detect user's leaving page
我正在构建一个 WebApp (ERP),我需要在页面上显示当前登录和活动的人员。通过监听 mouse/keyboard 事件并定期向数据库报告,我设法获得了相当准确的信息。
我不知道如何在人们关闭页面时将他们标记为离线。我尝试使用 onbeforeunload
,但当用户简单地更改页面时它显然会触发(单击 ERP 内的 link,它指向 ERP 中的另一个页面)。
然后我尝试使用 WebSockets
,但问题是一样的:每次重新加载页面时,WebSockets
连接都会关闭。
所以我想到了两个办法:
确实使用 WebSockets
,并通过调用 javascript 函数替换 all links以某种方式告诉服务器用户将要更改页面(这样服务器就不会将其标记为离线)。 但这感觉不对,从语义上讲,links 应该是 links,它只是指向另一个位置。
使用 WebSockets
或 AJAX
并且从不实际更改页面:links 被一个函数替换,该函数将调用内容并显示它在屏幕上(用 Javascript 更新 DOM)。但是同样,感觉也不对,因为从语义上讲页面没有意义并且 URL 永远不会改变,所以用户不能"copy paste"页面的link来引用它,对吧?
那么,是否有正确、干净的方法来做到这一点?感谢您的帮助。
已经有人post这种问题了。
希望对您有所帮助。
Detect if user has closed ALL windows for a website?
如果您的每个页面都有到服务器的 webSocket 连接,那么在服务器上您可以通过查看 webSocket 关闭来了解任何给定页面何时关闭。
为了避免在用户刚刚从您网站的一个页面导航到另一个页面时认为他们已经离开了网站,您只需添加一个延迟服务器端,以便您只报告用户已经离开您的网站如果在一段时间内(可能至少几秒钟)没有来自该用户的 webSocket 连接,则站点。
因此,当您检测到该用户的最后一个 webSocket 连接已关闭时,您会在您的服务器上设置一个计时器,持续数秒。如果用户在计时器关闭之前打开您网站上的另一个页面(通过导航或只是打开另一个页面),您将取消计时器并将用户计为仍处于连接状态。如果计时器响起,那么您现在就知道用户在您选择的任何时间段内(比如 10 秒)都离开了您的网站,对您来说,这将表示他们已经离开了网站。您可以在决定之前控制您希望该时间段持续多长时间,是的,它们已经消失了。
所有试图 "see" 用户在 Javascript 离开您的页面在浏览器中的尝试都会有漏洞,因为网页总是有办法在没有您的情况下关闭客户端 javascript 有机会告诉您的服务器。 webSocket 解决方案的美妙之处在于浏览器会在页面消失时自动可靠地告诉您的服务器,因为它关闭了 webSocket 并且您的服务器收到套接字已关闭的通知。
据我了解,您想计算 website/pages 上的活跃用户数。
识别用户(计算出 99% 的唯一 ID):
http://valve.github.io/blog/2013/07/14/anonymous-browser-fingerprinting/可以用别的库,很少。
在每个页面上不时在页面加载时发送意味着用户正在导航或(60 秒你可以选择更短的时间范围意味着用户正在页面上)计算的 id(指纹 js)到服务器(web-socket/ajax)
在服务器上,当新用户登录时(存储在数据库或会话中),您需要拥有带有到期日期(60 秒)增量的 ID 列表。
在您的网站上检索 id 的时间戳 <= 服务器时间的计数(60 秒 ajax/websocket)- 比如说 120 秒。
知道用户是否登录,并指定页面:
使用要在服务器发送的对象{指纹:123123124234,记录:true,页面:主页}
- 如果您没有在数据库中存储用户,请清除您的列表:
单独的线程(仅限服务器)访问该对象并销毁早于 10 分钟或您的页面会话设置的所有节点。
js 定时器:http://www.w3schools.com/jsref/met_win_setinterval.asp
希望对您有所帮助,如果用户仍在页面上或在页面加载时发出信号,id 会在 5 分钟后使用计时器发送到服务器。
获取用户在 60 秒帧内的持续时间。甚至页面上显示姓名的用户 :)
我正在构建一个 WebApp (ERP),我需要在页面上显示当前登录和活动的人员。通过监听 mouse/keyboard 事件并定期向数据库报告,我设法获得了相当准确的信息。
我不知道如何在人们关闭页面时将他们标记为离线。我尝试使用 onbeforeunload
,但当用户简单地更改页面时它显然会触发(单击 ERP 内的 link,它指向 ERP 中的另一个页面)。
然后我尝试使用 WebSockets
,但问题是一样的:每次重新加载页面时,WebSockets
连接都会关闭。
所以我想到了两个办法:
确实使用
WebSockets
,并通过调用 javascript 函数替换 all links以某种方式告诉服务器用户将要更改页面(这样服务器就不会将其标记为离线)。 但这感觉不对,从语义上讲,links 应该是 links,它只是指向另一个位置。使用
WebSockets
或AJAX
并且从不实际更改页面:links 被一个函数替换,该函数将调用内容并显示它在屏幕上(用 Javascript 更新 DOM)。但是同样,感觉也不对,因为从语义上讲页面没有意义并且 URL 永远不会改变,所以用户不能"copy paste"页面的link来引用它,对吧?
那么,是否有正确、干净的方法来做到这一点?感谢您的帮助。
已经有人post这种问题了。
希望对您有所帮助。
Detect if user has closed ALL windows for a website?
如果您的每个页面都有到服务器的 webSocket 连接,那么在服务器上您可以通过查看 webSocket 关闭来了解任何给定页面何时关闭。
为了避免在用户刚刚从您网站的一个页面导航到另一个页面时认为他们已经离开了网站,您只需添加一个延迟服务器端,以便您只报告用户已经离开您的网站如果在一段时间内(可能至少几秒钟)没有来自该用户的 webSocket 连接,则站点。
因此,当您检测到该用户的最后一个 webSocket 连接已关闭时,您会在您的服务器上设置一个计时器,持续数秒。如果用户在计时器关闭之前打开您网站上的另一个页面(通过导航或只是打开另一个页面),您将取消计时器并将用户计为仍处于连接状态。如果计时器响起,那么您现在就知道用户在您选择的任何时间段内(比如 10 秒)都离开了您的网站,对您来说,这将表示他们已经离开了网站。您可以在决定之前控制您希望该时间段持续多长时间,是的,它们已经消失了。
所有试图 "see" 用户在 Javascript 离开您的页面在浏览器中的尝试都会有漏洞,因为网页总是有办法在没有您的情况下关闭客户端 javascript 有机会告诉您的服务器。 webSocket 解决方案的美妙之处在于浏览器会在页面消失时自动可靠地告诉您的服务器,因为它关闭了 webSocket 并且您的服务器收到套接字已关闭的通知。
据我了解,您想计算 website/pages 上的活跃用户数。
识别用户(计算出 99% 的唯一 ID): http://valve.github.io/blog/2013/07/14/anonymous-browser-fingerprinting/可以用别的库,很少。
在每个页面上不时在页面加载时发送意味着用户正在导航或(60 秒你可以选择更短的时间范围意味着用户正在页面上)计算的 id(指纹 js)到服务器(web-socket/ajax)
在服务器上,当新用户登录时(存储在数据库或会话中),您需要拥有带有到期日期(60 秒)增量的 ID 列表。
在您的网站上检索 id 的时间戳 <= 服务器时间的计数(60 秒 ajax/websocket)- 比如说 120 秒。
知道用户是否登录,并指定页面:
使用要在服务器发送的对象{指纹:123123124234,记录:true,页面:主页}
- 如果您没有在数据库中存储用户,请清除您的列表:
单独的线程(仅限服务器)访问该对象并销毁早于 10 分钟或您的页面会话设置的所有节点。
js 定时器:http://www.w3schools.com/jsref/met_win_setinterval.asp
希望对您有所帮助,如果用户仍在页面上或在页面加载时发出信号,id 会在 5 分钟后使用计时器发送到服务器。
获取用户在 60 秒帧内的持续时间。甚至页面上显示姓名的用户 :)