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

时间:2015-01-30 08:35:06

标签: javascript html ajax web websocket

我正在构建WebApp(ERP),我需要显示当前登录并在页面上处于活动状态的人员。通过聆听鼠标/键盘事件并定期向数据库报告,我设法获得了非常准确的信息。

我不知道如何在关闭页面时将人员标记为脱机。我尝试使用onbeforeunload,但是当用户只是更改页面时,它会明显触发(单击ERP中的链接,指向ERP中的另一个页面)。

然后我尝试使用WebSockets,但问题是相同的:每次页面进行实时编码时,WebSockets连接都会关闭。

所以我可以想到两种方式:

  • 确实使用WebSockets,并通过调用javascript函数替换所有链接,该函数会以某种方式告诉服务器用户将要去更改页面(以便服务器不将其标记为脱机)。 但这感觉不对,从语义上讲,链接应该是链接,它只是指向另一个位置。

  • 使用WebSocketsAJAX并且永远不会实际更改页面:链接将被调用内容的函数替换,并在屏幕上显示(使用Javascript更新DOM) 。但同样,感觉不对,因为从语义上讲,页面没有意义,网址永远不会改变,因此用户无法“复制粘贴” “页面链接引用它,对吧?

那么,有没有正确,干净的方式呢?谢谢你的帮助。

3 个答案:

答案 0 :(得分:1)

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

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

因此,当您检测到此用户的最后一个webSocket连接已关闭时,在您的服务器上,您将计时器设置为几秒钟。如果用户在计时器关闭之前打开了您网站上的另一个页面(通过导航或只是打开另一个页面),则取消计时器并将用户计为仍然连接。如果计时器熄灭,那么您现在知道用户在您选择的任何时间段(例如10秒)已离开您的站点,并且对您而言,这将表示他们已经离开了站点。您可以在决定之前控制您想要该时间段的时间,是的,它们已经消失。

所有尝试尝试"看"用户在浏览器中使用Javascript离开你的页面会有漏洞,因为总有办法让网页关闭而你的客户端javascript没有机会告诉你的服务器。 webSocket解决方案的优点在于浏览器会自动且可靠地告诉您的服务器页面何时消失,因为它关闭了webSocket并且您的服务器收到了套接字已关闭的通知。

答案 1 :(得分:1)

据我了解,您希望计算在网站/网页上有效的用户。

  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秒。

  5. 了解用户是否已登录,并指定页面:

    使用在服务器上发送的对象{fingerprint:123123124234,记录:true,page:home}

    1. 如果您没有在数据库中存储用户,请清除您的列表:
    2. 单独的线程(仅限服务器)访问该对象并销毁所有早于10分钟或节点设置的节点。

      js timer:http://www.w3schools.com/jsref/met_win_setinterval.asp

      让我们希望它有所帮助,如果用户还在页面上,或者在页面加载时发出信号,那么id会在5分钟内使用定时器执行类似的操作发送到服务器。

      以60秒的速度获得用户的续约。甚至在页面上显示名字的用户:)

答案 2 :(得分:0)

有人已发布此类问题。

希望这可以帮到你。

Detect if user has closed ALL windows for a website?