用户关闭浏览器窗口时发送 ajax [重复]

Posted

技术标签:

【中文标题】用户关闭浏览器窗口时发送 ajax [重复]【英文标题】:Sending ajax when user closes browser window [duplicate] 【发布时间】:2015-04-27 16:25:32 【问题描述】:

我的主要目标和实际场景:如果两个用户共享相同的凭据,那么第二个用户无法登录系统,直到第一个已经登录的用户退出系统。

实际上,当用户关闭浏览器窗口时,我想在服务器数据库上设置login_flag=0。我在

$(window).on('unload', function() // ajax here with async:false );

$(window).on('beforeunload', function() // ajax here with async:false );

一切正常。但在 Chrome 中,它会记录以下消息:

主线程上的同步 XMLHttpRequest 已被弃用,因为 其对最终用户体验的不利影响。如需更多帮助, 检查http://xhr.spec.whatwg.org/。

我再次用谷歌搜索了相同的内容,发现在卸载事件中使用 Ajax 令人沮丧,并从here 找到以下详细信息

简而言之,他们反对将 ajax 与 async:falsewindow.unloadwindow.beforeUnload 方法一起使用。如果我从 Ajax 中删除 async 参数,则它不会按预期工作。

如果我想在用户关闭浏览器窗口的情况下在服务器端进行一些活动,那么正确的方法是什么?

【问题讨论】:

不确定当用户关闭选项卡/窗口时是否有任何适当的方法可以执行操作。在您的情况下,如果我很好地理解您要做什么,您可能希望有一个“last_activity”日期时间并这次定期更新。这样您就可以知道用户在过去 X 分钟内是否处于活动状态,并考虑他是在线还是离线。 您无法可靠地检测到用户何时关闭了浏览器窗口。有各种因素可能导致请求无法发送到服务器。你最好有某种状态,通过服务器上的用户活动保持活动状态,当你在一段时间内没有收到用户的消息时,然后将它们注销 正如我之前所说,请彻底解决问题。在将其标记为重复之前。 【参考方案1】:

我记得曾经遇到过类似的情况,一旦用户关闭窗口,我需要在服务器端执行操作。但是,我的研究得出与您相同的结论,即不鼓励在窗口卸载事件上使用任何类型的 ajax 调用。所以,我最后的方法是在窗口卸载事件中在客户端设置一个特定的 Cookie,当同一个用户访问该页面时,我才执行我需要的操作并从服务器端删除 cookie。

我知道这并不完全同时执行操作,但这是对我有用的最佳方法。

【讨论】:

我添加了更多有问题的细节。如果你能帮帮我。 我看到的唯一最好的解决方案(正如我在许多网站上看到的那样)当同一个用户尝试从不同的位置登录时,他们会收到警告说正在使用相同的凭据从不同的位置,如果您想继续,则来自其他位置的同一用户将被注销,因此一旦被接受,您就可以轻松地将用户从其他会话中注销。 哦!这很酷。你是怎么做到的?您能否说明实现它的步骤或一些参考链接?谢谢! 我假设您使用 php 作为后端。您可以查看this类似主题的答案。

以上是关于用户关闭浏览器窗口时发送 ajax [重复]的主要内容,如果未能解决你的问题,请参考以下文章

如果用户关闭浏览器,则从数据库中删除数据[重复]

Web 关闭页面时发送 Ajax 请求 —— sendBeacon

在返回 AJAX 响应之前阻止 Web 浏览器关闭 [重复]

在(后退按钮、前进按钮、关闭选项卡/浏览器)上运行最后一个 Ajax 请求 [重复]

如何在浏览器关闭时触发事件[重复]

Angular 5 - 当用户关闭浏览器窗口时如何进行 API 调用?