在一种场景下,server端维护了浏览器客户端的状态信息,当浏览器关闭时需要立刻通知server用户已经离开了,server端好清 理状态。这种情况的典型案例就是:浏览器客户端的即时通信,即web IM。因为用户关闭了窗口就表明用户已经不在线了,所有对话都结束了,server端和对话的另一方需要立刻知道这个状态变化。而一般情况 下,server端并不需要立刻通知的情况,那就无所谓了,只要过期超时即可。

要想在用户关闭浏览器后,server端得到通知,一般有两种做法:

方法一: 通过 javascript 轮询的方式向 server 发送心跳(使用异步ajax),server端记下上次心跳时间,server端Timer定期检查会话的心跳时间是否超时来判断用户是否已经离开了。这 种方法的缺点是,要想即时通知就得把心跳间隔时间设得短,server端检查的时间也要短,这样会导致server端的负担大大增加,所能承载的用户就会 较少。

方法二:不采用发送心跳的方式,而是在用户关闭浏览器时,通知server即可。这样server端的负担就小了。

window.onunload = function(){

ajax.callServer();

}

重点说一下方法二的实现。

首先,页面上注册 onunload 事件。如 body元素的 onunload 属性,或直接设置 window.onunload 。

注意是 onunload 而不是 onbeforeunload 事件,因为用户可以在 onbeforeunload 事件时选择“取消”从而不关闭窗口,而onunload 事件意味着窗口肯定是要被关闭的。

其次,在onunload事件中调用同步的ajax请求通知server,而非默认的异步ajax请求。 因为调用异步的ajax请求在一些浏览器下无法真正使server得到通知,实际上根本无法保障!在发出了这个异步请求之后,浏览器就要关闭窗口并清理所 有相关资源,因为这是异步请求,所以浏览器有理由认为无需等待该请求完成即可开始关闭窗口,这样该请求就可能失败(IE上就是这样,用异步请求无法通知到 server)。这也解释了为什么异步callServer()调用后面再加个alert语句就没问题了,因为alert语句在后面挡着,需要人来点确 认,所以可以完成对server的请求。而用同步的ajax请求则浏览器会等待该请求完成后才关闭窗口清理资源,因而就不会有这个问题。

这 就是一种使用同步ajax的场景,ajax中第一个a指的是 asynchronous 异步,当初引入ajax的主要目的就是引入一种异步执行的方法,绝大部分情况下应该使用异步方式执行ajax。同步ajax也许应该叫做 sjax ( s 是 synchronously)。

XMLHttpRequest 的 open 方法中的第三参数表示是同步还是异步,xmlHttp.open("GET", url, true); 各种支持Ajax的框架,如prototype、ext、dwr等肯定都有选项设置是否为异步模式。

最后,实际情况的做法是要结合方法一和方法二。 方法二由于各种原因(比如用户电脑突然停电、浏览器崩溃等,这你总没办法吧),总是难免浏览器在关闭时没有成功的通知server。尽管是少数情况,但 server端是要保证长期运行稳定的,要避免资源泄漏,所以必然server端还是需要定期检查会话是否过期的。但因为已经保证了大部分情况下 server得到了通知,所以server端的定期检查可以时间长一些,心跳间隔也可以时间长一些(但要小于server检查的时间间隔),因而对 server也不造成什么负担。

相关参考资料:

ajax同步的使用创场景,Ajax的同步调用场景——使用同步Ajax在 onunload 事件时通知服务器...相关推荐

  1. java同步转化成异步_Java 如何把异步调用模拟成同步调用

    在某些时候,须要把异步调用模拟成同步调用的形态.例如,基于基于异步通讯的客户端须要同步调用. :-)异步 要实现这个转换,能够有多种实现方法:this 1.很经常使用的方法,应用循环机制:spa bo ...

  2. AJAX怎么实现同步请求?Ajax同步和异步请求有什么区别以及使用场景有哪些?

    一.AJAX怎么实现同步请求? ajax请求我们分为同步请求和异步请求,但是默认的都是异步请求,那么,当我们想用ajax同步请求时,我们该如何去实现这个同步请求呢?接下来的这篇文章就来给大家介绍一下关 ...

  3. 什么是WebSocket和Ajax轮询?各自区别?各自应用的场景

    什么是Ajax轮询 Ajax它一般是异步的.也能同步使用. 聊天是需要长连接的,在一些场景下我们不想使用比较耗费资源的长连接,又想实现数据的监听,这时候我们就会使用Ajax的轮询. Ajax轮询一般分 ...

  4. ajax远程调用,jquery中的ajax方法怎样通过JSONP进行远程调用

    关于JSONP的概念和为什么要使用JSONP网上已经有很多教程,这一节主要演示下在JQUERY中的ajax方法怎样通过JSONP进行远程调用 首先介绍下$.ajax的参数 type:请求方式 GET/ ...

  5. 通过jQuery调用ASP.NET的AJAX

    传统上,在ASP.NET页面中实现AJAX的方法是拖放一个ScriptManager控件,并进行一系列的设置和相关编程.但事实上,这并不是理想的解决方案.使用jQuery来调用ASP.NET后台的方法 ...

  6. ajax 与php页面取值,在同一页面中使用PHP和AJAX的最佳方法

    在同一页面上,我有几种类型的代码:PHP,JS和HTML.我想从HTML表单中获取信息并进行PHP处理,而无需在单击"发送"按钮后重新加载页面. PHP获取它通过API发送的值(来 ...

  7. ajax一次请求多条记录,Jquery 一次处理多个ajax请求的代码

    Jquery 一次处理多个ajax请求的代码 复制代码 代码如下: $(document).ready(function () { $('#getsetgo').click(function () { ...

  8. setstate是同步还是异步_【vert.x准备篇1】同步和异步,阻塞和非阻塞概念澄清

    为了能更好的理解vert.x的线程模型,我们必须要先明确几个概念:同步(Synchronous)和异步(Asynchronous),阻塞(Blocking)和非阻塞(Non-Blocking).关于这 ...

  9. java同步读写,关于java:Collections中的synchronizedMap方法是否同步读写操作

    本问题已经有最佳答案,请猛点这里访问. 当我做一个收藏.同步DMAP(Somehashmap)时,所有的都可以进入同步地图吗?还是只写同步操作?如果从地图上读到两条线怎么办?威尔是同步的吗?似乎有必要 ...

最新文章

  1. Android之路-------Activity的详解
  2. python下载m3u8地址_python 下载m3u8视频的示例代码
  3. Spring Ioc 之 Bean的加载(1)(生命周期)
  4. 风雨彩虹,铿锵玫瑰——女足夺冠
  5. java常用类介绍及源码阅读(LinkedList)
  6. gbase迁移mysql_基于datax实现从gbase到mysql的数据迁移--时间字段篇
  7. 每日linux命令学习-历史指令查询(history、fc、alias)
  8. DirectAdmin安装mod_encoding支持中文
  9. 我的Java开发学习之旅------Java经典排序算法之冒泡排序
  10. vs 服务容器中已存在服务_无服务器vs容器,企业如何正确选择?
  11. 【2020.2.29更新】高通蓝牙芯片QCC3003,QCC3008 学习视频教材
  12. Word VBA设置所有图表宽度并居中
  13. [转]数据恢复 文件恢复工具 DiskGenius v4.9.1 绿色专业版及单文件
  14. 树莓派默认密码_树莓派快速指南,从购买到开机
  15. LIN、K、CAN、CAN-FD、FlexRay、Ethernet 、MOST、VAN常见汽车总线简介
  16. 保护眼睛的颜色和各种背景颜色设置方法(转)
  17. 【Mac/iOS】解决CoreBluetooth中Characteristic的Properties显示问题
  18. 【面试】面试的时候,如何自我介绍?
  19. JAVAMail 使用imap协议分析邮件
  20. BIOS入门基础------与BMC通信(IPMI)

热门文章

  1. ArcGIS10.8完美实现MODIS NDVI数据格式转换和投影变换
  2. python梦幻西游鼠标偏移_梦幻西游鼠标漂移,求修改,不知道错误在哪
  3. python制表符怎么用_python怎样输入制表符
  4. 自己写个中国天气网:利用leaftjs实现多图层切换、风场、洋流、温度插值等值面、定位、逆地址解析、任意位置天气情况
  5. 【杂谈第37期】用三句话了解BRD、MRD和PRD文档
  6. 彻底搞明白概率论:随机事件,样本空间,必然事件,不可能事件
  7. Java中Array.sort()的几种用法[转]
  8. Office 365身份认证--深度解析(一)
  9. 机器学习算法----贝叶斯网络
  10. js处理树形结构数据过滤