红书第二十一章 Ajax和comet

        Ajax技术用于实现“无需刷新页面即可从获得服务端数据”。在Ajax出来前,只能用一些hack手段来实现不刷新页面的数据更新。
        Ajax技术的核心是XMLHttpRequest(简称XHR)。

1.XMLHttpRequest对象

        讲了一下创建xhr对象。创建本来是没什么好说的,但是IE7以下有些特别,所以作者介绍了一些判断来判断去的代码,用来兼容各浏览器。

1.1 XHR的用法

        介绍了xhr对象怎么调用它的方法,怎么传参,怎么接收结果。
        其中我比较注意的几点:
        (1)xhr对象有readyState属性,0未初始化 1启动 2发送 3接收 4完成。
        (2)xhr对象有readystatechange事件,可以监听。
        (3)xhr对象有abort方法可以调用,能取消异步请求。调用后,readystatechange事件不再会触发,也不再允许访问与响应有关的对象属性。
        (4)不建议重用xhr对象 (大概意思是建议每用一次新建一个,用完一次就销毁一个)

1.2 HTTP头部信息

        介绍了xhr对象与HTTP请求头之间的一些交互
        摘抄几点:
        (1)xhr的setRequestHeader方法可以设置自定义的请求头部信息。(应在open方法调用之后、send方法调用之前设置)
        (2)xhr的getResponseHeader方法可以获取响应头部信息
        (3)xhr的getAllResponseHeaders方法可以一次性取得一个包含所有头部信息的长字符串

1.3 GET请求

        GET请求的参数是直接加到URI 末尾的。
        需要注意的是加到URI末尾的查询字符串格式应当正确。
        查询字符串中的参数和值应使用encodeURIComponent进行编码。

1.4 POST请求

        POST请求的主体可以包含各种格式的数据。
        调用xhr的send方法时,传入参数,即可指定POST请求的数据。
        使用POST请求时,如想模拟表单提交,可指定请求头Content-Type为application/x-www-form-urlencoded,然后给send方法传入想提交的表单序列化后的字符串。

        POST请求消耗的资源比GET请求多,发送相同的数据的情况下,GET请求速度比POST请求快,甚至可达到POST速度的两倍。

2.XMLHttpRequest 2级

2.1 FormData

        FormData用于序列化表单,以及创建与表单格式相同的数据。
        它的方便之处在于不用明确在xhr对象设置请求头,xhr对象能够识别send方法传入的是FormData实例,自动配置请求头。

2.2 超时设定

        在open方法调用后、send方法调用前,xhr.timeout=毫秒数,可以设置超时时间。
        超时时,xhr的状态可能已经走到4,但超时后,xhr对象不允许访问status属性,所以在onreadystatechange回调中,访问status属性要加try catch逻辑。

2.3 overrideMimeType方法

        这个方法用于重写xhr响应的MIME类型,这样可以由前端决定按什么格式处理响应内容。
        注意要在send方法调用前调用。

3.进度事件

        有6个进度事件:loadstart(开始接收响应数据时触发),progress(接收响应期间不断触发),error(请求发生错误时触发)、abort(主动取消后触发)、load(接收到完整响应数据时触发)、loadend(在触发load/abort/error/通信完成时触发)

3.1 load事件

        说了一些load事件回调函数的写法,和浏览器差异。
        我搞不懂为什么它说“Firefox实现中引入了load事件,用以替代readystatechange事件”,所以到底还有没有readystatechange事件!?

3.2 progress事件

        progress事件会给回调函数传入一个参数event对象,
        event.target 就是xhr对象
        event.lengthComputable 表示进度信息是否可用的布尔值
        event.position 表示已经接收的字节数
        event.totalSize 表示根据响应头部Content-Length指定的字节数
        必须在open方法调用前添加onprogress事件回调。

4.跨源资源共享

        xhr实现ajax通信受限于跨域安全策略。CORS(跨域资源共享)是W3C的一个工作草案,定义了在访问跨域资源时,浏览器和服务器应该如何沟通。
        CORS的基本思想,就是使用自定义的HTTP头部让浏览器于服务器进行沟通,从而决定请求或响应应该成功还是应该失败。
        请求头Origin和响应头Access-Control-Allow-Origin两边对不成功,浏览器就会驳回请求。

4.1 IE对CORS的实现

        略。

4.2 其它浏览器对CORS的实现

        略。

4.3 Preflighted Requeusts

        就是平时抓包看到的预请求机制。浏览器觉得请求不是简单请求,就会向服务器验证是否允许前端发送这样的请求。

4.4 带凭据的请求

        跨域请求默认不带凭据(cookie、HTTP认证及客户端SSL证明等),但可以设置成带的。
        如果服务端允许请求端带凭据,请求才会成功返回给JavaScript,不然不会返回。

4.5 跨浏览器的CORS

        略。

5.其它跨域技术

        介绍除了CORS以外的跨域技术

5.1 图像Ping

        <img>可以从任何url加载图像,不用担心是否同源。所以有了图像ping,这是一种与服务器进行单向的跨域通信的一种方式,请求的数据是查询字符串的形式,响应的可以是任意内容。
        图像ping常用于跟踪用户点击页面或动态广告曝光次数。它的缺点:1.只能发送GET请求 2.无法访问服务器的响应文本
        不知道为什么说“无法访问服务器的响应文本”,img的内容不能搞出来的吗??

5.2 JSONP

        JSONP是通过动态script元素来实现的,使用时,为script元素指定一个跨域的url,当加载完成后,加载到的代码就开始运行。
        一般大家是这么实现的:服务端返回一份js文件。这个js文件的内容,是把一堆JSON字符串丢给一个函数。
        这个函数名字在请求端指定url的时候就拼接在url参数里了。
        服务端从url读取到那个函数的名字(对它来说就是个字符串),然后拼接:函数名(要返回的JSON);这就是那个js文件的内容了。
        前端加载到js以后自动执行:函数名(返回的JSON);
        当然,这个函数也是前端已经定义好的。
        通过这种协作,服务端把数据给到了前端js。

        它的优点是可以访问响应文本,不像img拿不到响应内容。缺点是不安全,动态script元素加载跨域的资源代码,如果这个代码含有恶意代码,就很不安全。
        https://blog.csdn.net/hansexploration/article/details/80314948 这博客讲得比红书清晰多了

5.3 Comet

        comet是建立在Ajax基础上,但是能让服务器主动向页面推送数据的技术。
        有两种实现方式,一种是“长轮询”,就是页面先发送请求,服务端什么时候想推送了什么时候再响应。

        第二种是“流”,一个HTTP连接一直不结束生命周期,然后服务端时不时地再推一些内容到前端。对前端来说,xhr对象的readyState时不时地变成3(接收),每次变成3,xhr.responseText都多了一些内容。

5.4 服务器发送事件

        SSE(服务器发送事件),SSE API用于创建“能让服务器主动推送的HTTP连接”,这个API把短轮询(最蠢的那种)、长轮询、HTTP流的实现都封装成现成的方法了,还能自动在异常断开时重连。

5.5 Web Socket

        不多说了,平时工作中也有用。
        它使用的是另外的协议,比HTTP协议好在发送的数据量少,开销少。

5.6 SSE 与 Web Sockets

        比较两者优劣。略。

6.安全

        分析了安全性。略。

        最后:关于Ajax想要完整了解的话,话题非常庞大,有专门讨论Ajax的书,比如《Ajax高级程序设计》

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,245评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,749评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,960评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,575评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,668评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,670评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,664评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,422评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,864评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,178评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,340评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,015评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,646评论 3 323
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,265评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,494评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,261评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,206评论 2 352