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