javascript 卸载事件可以用来可靠地触发 AJAX 请求吗?

4si2a6ki  于 2022-12-28  发布在  Java
关注(0)|答案(5)|浏览(77)

我需要一种方法来监视用户编辑会话,我正在回顾的解决方案之一是使用unload事件发送ajax请求,通知服务器编辑会话结束。(参见:Monitoring User Sessions to Prevent Editing Conflict
我对unload事件的了解(相当有限)表明,附加到该处理程序的代码必须快速运行,因此,通常用于清除对象以防止内存泄漏。
我的问题是,对于这个目的,这个工作是否足够可靠?
ps.我知道async: false选项。

inb24sb2

inb24sb21#

如果你的服务器响应速度足够快的话,这个方法是相当可靠的。不过还是要注意一些事情。如果你关闭浏览器并在卸载事件时发送 AJAX 请求,很有可能在窗口对象被销毁之前,响应不会及时从服务器返回。这种情况下会发生什么(至少在IE中)是它将孤立你的连接对象,并且直到连接超时时才正确终止它。如果你的服务器没有打开连接保持活动,在你关闭2个窗口后(同时仍然有另一个窗口打开),您将耗尽打开的连接到服务器(为IE6-7,为IE8 - 6窗口),您将无法打开您的网站,直到您的连接超时被击中。
我遇到过这样的情况,之前我打开一个弹出窗口,在卸载时发送 AJAX 请求,这是非常可靠的,但它被上面描述的问题所困扰,我花了很长时间来跟踪它,并了解发生了什么事。之后,我所做的,是我确保打开窗口将有相同的代码来调用服务器,并且在每次卸载时检查开启程序,如果存在,则在那里运行代码。
看起来,如果您关闭最后一个浏览器窗口,IE将正确地破坏连接,但如果另一个窗口打开,它不会。
P.S.对上面的答案进行评论, AJAX 不是真正的异步。至少它的JS实现不是。在你发送请求之后,你的JS代码仍然会等待来自服务器的响应。它不会阻止你的代码执行。但由于服务器可能需要一段时间才能响应(或者足够长的时间让Windows终止IE窗口对象),您可能也很可能会遇到上述问题。

7jmck4yq

7jmck4yq2#

你试过用

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

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

eimct9ow

eimct9ow3#

我们有一个案例需要这样做。这是一个报表页面,需要大量的服务器内存,所以我们希望在它们离开页面时立即释放它。我们创建了一个框架集,并在其中添加了卸载处理程序。最可靠的方法是将图像的src设置为释放脚本。我们实际上使用了unload和onbeforeunload来实现跨浏览器兼容性。它没有“我不喜欢网络工具包,但是管理层对此还可以接受。
然而,这不是我提出的解决方案。我会使用心跳方法,它涉及更多的工作,但要健壮得多。
你的页面应该定期发送心跳请求。每个请求设置页面的最后一个心跳。然后你需要一个线程在服务器上运行,如果最后一个心跳太久了,就清除内存。
这并不能解决页面长时间处于打开状态的问题,因此你需要对用户活动进行监控,并在一段时间不活动后离开该页面(确保你与用户确认)

bxjv4tth

bxjv4tth4#

你必须自己测试你的特定场景是否能在unload中运行,但是由于AJAX是异步的,所以发出 AJAX 请求非常快。你只需要发送请求,然后就完成了!(不过,你可能需要清除你刚刚创建的请求对象。)
如果您想验证 AJAX 请求是否发出了,那么您就需要考虑更多/使用async:false选项(如this discussion所示)。但是,发送只是一个快速的boom和re-done操作。

9udxz4iz

9udxz4iz5#

我有一个案例,我只需要通知服务器端有关卸载,而不关心响应。
如果是这种情况,您可以ignore_user_abort,然后您知道它会“可靠地”发生

相关问题