我需要一种方法来监视用户编辑会话,我正在审查的解决方案之一将让我使用unload
事件发送 ajax 请求以通知服务器编辑会话结束。(请参阅:监控用户会话以防止编辑冲突)
我对unload
事件的(相当有限的)阅读表明附加到此处理程序的代码必须快速运行,因此通常用于清除对象以防止内存泄漏。
我的问题是,为此目的,这项工作是否足够可靠?
附注。我知道这个async: false
选项。
我需要一种方法来监视用户编辑会话,我正在审查的解决方案之一将让我使用unload
事件发送 ajax 请求以通知服务器编辑会话结束。(请参阅:监控用户会话以防止编辑冲突)
我对unload
事件的(相当有限的)阅读表明附加到此处理程序的代码必须快速运行,因此通常用于清除对象以防止内存泄漏。
我的问题是,为此目的,这项工作是否足够可靠?
附注。我知道这个async: false
选项。
如果您的服务器足够快以进行响应,则此方法相当可靠。不过确实需要注意一些事情。如果关闭浏览器并在卸载事件时发送 AJAX 请求,则很有可能在窗口对象被销毁之前响应不会及时从服务器返回。在这种情况下(至少对于 IE)会发生什么,它将孤立您的连接对象,并且在连接超时之前不会正确终止它。如果您的服务器没有打开连接保持连接,在您关闭 2 个窗口后(同时仍然打开另一个窗口),您将耗尽与服务器的开放连接(对于 IE6-7,对于 IE8-6 窗口)在达到连接超时之前,您将无法打开您的网站。
我之前遇到过这样的情况,我打开一个在卸载时发送 AJAX 请求的弹出窗口,它非常可靠,但它被上述问题所困扰,我花了很长时间来跟踪它下来并了解发生了什么。在那之后,我所做的是确保打开的窗口将具有相同的代码来调用服务器,并且在每次卸载时检查开启器并在那里运行代码(如果存在)。
似乎如果您关闭最后一个浏览器窗口,IE 会正确破坏连接,但如果打开另一个窗口,则不会。
PS 只是为了评论上面的答案,AJAX 并不是真正的异步。至少它的 JS 实现不是。发送请求后,您的 JS 代码仍将等待服务器的响应。它不会阻止您的代码执行,但由于服务器可能需要一段时间来响应(或足够长的时间让 Windows 终止 IE 窗口对象),您可能并且可能会遇到上述问题。
你有没有试过使用
var i = new Image(1,1);
i.src='http://...'
并且只是从服务器返回一些空图像。我认为它应该是可靠的,脚本会阻塞。顺便说一句:很高兴添加时间戳以防止缓存。
我们有一个需要它的案例。这是一个报告页面,需要大量的服务器内存,所以我们想在他们离开页面后立即释放它。我们创建了一个框架集并在那里添加了卸载处理程序。最可靠的方法是将图像的 src 设置为释放脚本。我们实际上同时使用了 unload 和 onbeforeunload 来实现跨浏览器兼容性。它在 web kit nightlies 中不起作用,但管理人员对此没有意见。
然而,这不是我提出的解决方案。我会使用心跳方法,它涉及更多的工作,但更强大。
您的页面应该定期发送心跳请求。每个请求都会设置页面的最后一次心跳。然后,您需要一个在服务器上运行的线程,如果最后一次心跳时间太长,则清除内存。
这并不能解决长时间离开页面的问题。为此,您需要对用户活动进行一些监控,并在一段时间不活动后离开该页面(确保与用户确认)
您必须自己测试您的特定场景是否在您拥有的时间内工作unload
,但发出 AJAX 请求非常快,因为 AJAX 是异步的。您只需发送请求,然后就完成了!(不过,也许您必须清除刚刚创建的请求对象。)
如果您想验证 AJAX 请求是否成功,那么您必须更加担心/使用该async:false
选项(如本讨论所示)。但是,只是发送是一个快速的繁荣 - 你就完成了操作。
我有一个案例,我只需要通知服务器端有关卸载的信息,而不关心响应。
如果那是你的情况,你可以ignore_user_abort然后你知道它会“可靠地”发生