是否可以在不使用ajax请求的情况下检查用户是否在线?

Posted

技术标签:

【中文标题】是否可以在不使用ajax请求的情况下检查用户是否在线?【英文标题】:Is it possible to check if users are online without using ajax request? 【发布时间】:2012-05-16 13:52:28 【问题描述】:

如果可能的话,我正在寻找一种在不使用 ajax(实时)的情况下显示在线用户/朋友的解决方案。我想避免在每个指定的时间间隔后向服务器发出 ajax 请求以检查用户是否在线。目前,该应用程序工作正常并显示在线用户,但向服务器发出巨大请求以使用 ajax 方法检查用户是否在线。此外,由于大量的 ajax 调用,有时浏览器行为也会受到影响。 [更多信息:我正在使用 mysql 数据库、php、Jquery。]

【问题讨论】:

您将不得不以某种方式寻找更新——无论是实时的,还是在页面刷新时。 您可以创建一个客户端使用持久连接连接的套接字服务器... 您可以保持与服务器的连接(如 gmail)。但是来吧,只显示在线人:ajax调用是可以的。或者创建一个具有自动刷新值的 iframe @MichaelLaffargue:有时浏览器会因为多次调用或javascript溢出而崩溃。 @MahavirM​​unot 好吧,您在页面加载后想要服务器信息,您必须通过 ajax 请求服务器。为避免使用 1 个连接,您可以创建一个专门为该任务调用的子域:例如 refresh.domain.com。 【参考方案1】:

我的建议是每次用户访问页面时更新数据库中的字段。要确定他们是否仍然在线,请检查最后一次访问是否在某个时间间隔内,例如 20 分钟前。如果不是,则假设他们处于离线状态。

这可能是最简单的方法,尽管它并不完全是“实时”的。如果我只是关闭浏览器就离开了你的网站,那么我将在 20 分钟后显示为“离线”。

【讨论】:

请再次查看我的问题。我知道显示在线用户的方式,但要检查上次访问时间,我必须调用脚本以获取每个指定时间间隔后的上次访问时间。 没有。我说只检查页面加载的最后访问时间,这意味着不涉及AJAX。对于一个相当复杂的问题,这是一个简单、天真的解决方案。 我同意你的观点,但只要用户点击任何链接,就会加载页面。如果页面没有刷新/加载,那么它将如何工作。 如果您正在寻找一种无需页面加载即可工作的解决方案,那么您将不得不研究使用长轮询/彗星或其他一些技术的服务器推送,其中一些技术使用无论如何都是 AJAX。 我知道 www.ape-project.org 但没有完整的文档/用户指南可用。如果你知道,你能建议吗?我知道它会起作用【参考方案2】:

以下是您应该如何做的明确看法:

用户请求页面 记录发出请求的时间(将用户标记为活动) 获取最近提供页面

基本上,每次页面加载都会刷新用户的“最后一次看到”时间,如果用户在阈值范围内,则认为该用户处于活动状态。更重要的是,用户处于非活动状态。大多数聊天客户端会在 15 分钟后将用户标记为非活动状态,例如按键等,在我们的例子中,进行页面加载。

如果您想要实时数据,没有比使用 AJAX(间隔轮询和连接保持)其他(更好)的方法。除了 ajax 之外,我之前使用过的一些用于触发页面加载的粗略技术包括:

隐藏的、不断刷新的 iframe,或加载好友列表的 iframe 间隔 1x1 的间隔加载,使用路由 url 缓存破坏的 gif,以便它通过日志记录机制。

你可以使用WebSockets,但到目前为止它还不能跨浏览器,除非你使用flash的socket能力和ExternalInterfaceCall从flash调用JS。

【讨论】:

【参考方案3】:

在一定时间间隔后,您必须以某种方式对服务器进行 ajax 调用以与在线用户通信/获取在线用户。

【讨论】:

以上是关于是否可以在不使用ajax请求的情况下检查用户是否在线?的主要内容,如果未能解决你的问题,请参考以下文章

原生Ajax GET请求无刷新实现文本框用户名是否被注册

是否可以在不执行 Spring Controller 方法的情况下检查权限?

Firebase 消息:我可以在不调用浏览器提示的情况下检查用户是不是已经拥有令牌?

如何在不手动检查的情况下确定网站是不是使用 webassembly?

是否可以在不详尽检查函数体中的每个参数的情况下缩小重载参数的类型?

在不提示手表的情况下检查用户是不是连接了 AppleWatch