Page 240 - Web性能权威指南
P. 240

•   支持请求超时;
                 •   支持传输二进制和文本数据;
                 •   支持应用重写媒体类型和编码响应;
                 •   支持监控每个请求的进度事件;
                 •   支持有效的文件上传;
                 •   支持安全的跨来源请求。

                 2011 年,“XMLHttpRequest Level 2” 规 范 与 原 来 的 XMLHttpRequest 工 作 草 案
                 合并。此后,无论人们提及 XHR 时说 Level  1 还是 Level  2,其实已经没有关系
                 了。今天,只有一个统一的 XHR 规范。而所有新的 XHR2 功能,都是通过同一个
                 XMLHttpRequest API 提供的:接口不变,功能增强。


                            新 XHR2 功能目前已经得到所有现代浏览器支持,参见:caniuse.com/
                            xhr2。此后,只要我们提到 XHR,指的都是 XHR2 标准。


                 15.2 跨源资源共享(CORS)


                 XHR 是一个浏览器层面的 API,向我们隐藏了大量底层处理,包括缓存、重定向、
                 内容协商、认证,等等。这样做有两个目的。第一,XHR 的 API 因此非常简单,开
                 发人员可以专注业务逻辑。其次,浏览器可以采用沙箱机制,对应用代码强制施加
                 一套安全限制。
                 XHR 接口强制要求每个请求都严格具备 HTTP 语义:应用提供数据和 URL,浏览
                 器格式化请求并管理每个连接的完整生命周期。类似地,虽然 XHR API 允许应用添
                 加自定义的 HTTP 首部(通过 setRequestHeader() 方法),同时也有一些首部是应用
                 代码不能设定的:

                 •   Accept-Charset、Accept-Encoding、Access-Control-*
                 •   Host、Upgrade、Connection、Referer、Origin
                 •   Cookie、Sec-*、Proxy-* 以及很多其他首部

                 浏览器会拒绝对不安全首部的重写,以此保证应用不能假扮用户代理、用户或请求
                 来源。事实上,保护来源(Origin)首部特别重要,因为这是对所有 XHR 请求应用
                “同源策略”的关键。

                            一个“源”由应用协议、域名和端口这三个要件共同定义。比如,(http,
                            example.com, 80) 和 (https, example.com, 443) 就是不同的源。更多信息,请参
                            考“The Web Origin Concept”(http://tools.ietf.org/html/draft-abarth-origin)。

                                                                       XMLHttpRequest    |   227
   235   236   237   238   239   240   241   242   243   244   245