36

我需要一种方法来监视用户编辑会话,我正在审查的解决方案之一是让我使用unload事件发送 ajax 请求以通知服务器编辑会话结束。(请参阅:监控用户会话以防止编辑冲突

我对事件的(相当有限的)阅读unload表明附加到此处理程序的代码必须快速运行,因此通常用于清除对象以防止内存泄漏。

我的问题是,这是否可以足够可靠地用于此目的?

PS。我知道这个async: false选项。

4

5 回答 5

36

如果您的服务器响应速度足够快,则此方法相当可靠。不过确实要注意的事情。如果您关闭浏览器并在卸载事件时发送 AJAX 请求,则很有可能在窗口对象被销毁之前响应不会及时从服务器返回。在这种情况下(至少在 IE 中)发生的情况是,它将孤立您的连接对象,并且在连接超时发生之前不会正确终止它。如果您的服务器没有打开连接保持活动,在您关闭 2 个窗口后(同时仍然打开另一个窗口),您将用完与服务器的打开连接(对于 IE6-7,对于 IE8-6 窗口)在连接超时之前,您将无法打开您的网站。

我之前遇到过这样的情况,我打开一个弹出窗口,在卸载时发送一个 AJAX 请求,它非常可靠,但是受到上述问题的困扰,我花了很长时间才跟踪它下来并了解发生了什么。在那之后,我所做的是确保打开的窗口将具有相同的代码来调用服务器,并且在每次卸载时检查打开器并在那里运行代码(如果存在)。

似乎如果您关闭最后一个浏览器窗口,IE 将正确破坏连接,但如果另一个窗口打开,则不会。

PS 只是为了评论上面的答案,AJAX 并不是真正的异步。至少它的JS实现不是。发送请求后,您的 JS 代码仍将等待服务器的响应。它不会阻止您的代码执行,但由于服务器可能需要一段时间才能响应(或者足够长的时间让 Windows 终止 IE 窗口对象),您可能会并且很可能会遇到上述问题。

于 2010-08-29T19:24:18.237 回答
12

你试过用

var i = new Image(1,1); 
i.src='http://...'

并且只是从服务器返回一些空图像。我认为它应该是可靠的,脚本会阻塞。顺便说一句:很高兴添加时间戳以防止缓存。

于 2010-12-25T18:58:26.097 回答
3

我们有一个需要它的案例。这是一个需要服务器上大量内存的报告页面,因此我们希望在他们离开页面后立即释放它。我们创建了一个框架集并在那里添加了卸载处理程序。最可靠的方法是将图像的 src 设置为释放脚本。我们实际上同时使用了 unload 和 onbeforeunload 来实现跨浏览器兼容性。它在 web kit nightlies 中不起作用,但管理层对此表示满意。

但是,这不是我提出的解决方案。我会使用心跳方法,它涉及更多的工作,但更健壮。

您的页面应定期发送心跳请求。每个请求都会设置页面的最后一个心跳。然后,您需要一个在服务器上运行的线程,如果上次心跳时间太长,则清除内存。

这并不能解决长时间离开页面的问题。为此,您需要对用户活动进行一些监控,并在一段时间不活动后离开该页面(确保与用户确认)

于 2010-08-27T17:37:28.103 回答
1

您必须自己测试您的特定场景是否适用于您所拥有的时间unload,但是发出 AJAX 请求非常快,因为 AJAX 是异步的。您只需发送请求,然后您就完成了!(不过,也许您必须清除刚刚创建的请求对象。)

如果您想验证 AJAX 请求是否成功,那么您将不得不更加担心/使用该async:false选项(如本讨论所示)。但是,只是发送是一个快速的繁荣和你完成的操作。

于 2010-08-27T15:47:50.660 回答
-2

我有一个案例,我只需要通知服务器端卸载并且不关心响应。

如果那是您的情况,您可以忽略_user_abort,然后您就知道它会“可靠地”发生

于 2014-07-02T08:53:03.690 回答