SlideShare uma empresa Scribd logo
1 de 22
跨域 XHR
你不知道的 HTTP

  RDSS 小组
   2012-04
作者


     沉鱼
     fool2fish@gmail.com
     http://fool2fish.cn
关于
RDSS
Research on Domain Specific Solution

我们致力于已有的规范、解决方案、产品等研究
并实践到工作中
演示
http://fool2fish.aliapp.com/rdss/http/xhr.
  html

服务器端源码
http://fool2fish.aliapp.com/rdss/http/ser
  ver.js
目录
•   Ajax 结构
•   参考资料
•   简单请求
•   Preflight 请求
•   带验证的请求
•   兼容性
Ajax 结构
                    Ajax



  getScript         jsonp           Xhr


                    Same                        Cross
                    origin                      domain



              Get            post         Get            post
参考资料
• Cross-Origin Resource Sharing – w3c
• Cross-domain Ajax with Cross-Origin
  Resource Sharing - ncz
• HTTP access control (CORS) – mdn
• http://arunranga.com/examples/acces
  s-control/ (demo)
• Cross-Origin Resource Sharing
  (CORS)是W3c工作草案,它定义了在
  跨域访问资源时浏览器和服务器之间
  如何通信。CORS背后的基本思想是
  使用自定义的HTTP头部允许浏览器和
  服务器相互了解对方,从而决定请求
  或响应成功与否。
简单请求
浏览器
• 对一个简单的请求,没有自定义头部,
  要么使用GET,要么使用POST,它的
  Content-type为text/plain,请求会发送
  一个名叫Orgin的额外的头部。

例:Origin: http://fool2fish.cn


Refer: Cross-domain Ajax with Cross-Origin Resource Sharing - ncz
服务器
• 如果服务器确定请求被通过,它将发
  送一个Access-Control-Allow-Origin头
  部响应发送请求的同一个源,如果是
  一个公共资源,则返回“*”。

例:Access-Control-Allow-Origin:
 http://fool2fish.cn

Refer: Cross-domain Ajax with Cross-Origin Resource Sharing - ncz
• 注意,请求和响应都不包括cookie信
  息。




Refer: Cross-domain Ajax with Cross-Origin Resource Sharing - ncz
• FF3.5 +,Safari 4和chrome通过使用
  XMLHttpRequest对象支持其使用。在
  IE8中也是一样,用同样的方式你需要
  使用XDomainRequest对象。




Refer: Cross-domain Ajax with Cross-Origin Resource Sharing - ncz
Preflight 请求
Browser
• 除了GET或POST,通过一种称之为
  preflighted请求的服务器透明验证机制,
  CORS允许使用自定义的头部和方法,以
  及不同主体内容类型。当你尝试使用高级
  选项中的一个来试着建立一个请求时,这
  时就建立了一个preflighted请求。该请求
  使用可选的方法,并发送如下头部:
   – Origin
   – Access-Control-Request-Method
   – Access-Control-Request-Headers
Refer: Cross-domain Ajax with Cross-Origin Resource Sharing - ncz
Server
• 在请求期间,服务器能决定是否允许
  这类请求。服务器通过在响应中发送
  以下头部来与浏览器通信。

   – Access-Control-Allow-Origin
   – Access-Control-Allow-Methods
   – Access-Control-Allow-Headers
   – Access-Control-Max-Age

Refer: Cross-domain Ajax with Cross-Origin Resource Sharing - ncz
• preflighted 请求一旦作出,结果将按
  响应中规定的时间缓存下来;第一次
  做出这样的请求,你将引发一次额外
  的HTTP请求。

• Firefox 3.5+, Safari 4+和Chrome都支
  持preflighted 请求,IE8则不支持。



Refer: Cross-domain Ajax with Cross-Origin Resource Sharing - ncz
带验证的请求
Browser
• 默认状态下,跨域请求不提供证书
  (cookie、HTTP身份验证、客户端SSL
  证书)。你可以规定一个请求应该通过设
  置withCredentials属性为true来发送证书。
  如果服务器允许credentialed请求,那么
  它将用下面的头部作出响应:

例:Access-Control-Allow-Credentials: true

Refer: Cross-domain Ajax with Cross-Origin Resource Sharing - ncz
Server
• 如果一个credentialed请求被发送,而
  这个头部没在响应头中相应的返回,
  浏览器不会将响应传递给
  JavaScript(responseText是一个空字
  符串,状态为0,onerror()被调用)。




Refer: Cross-domain Ajax with Cross-Origin Resource Sharing - ncz
• IE8不支持withCredentials属性,irefox
  3.5+, Safari 4+和Chrome都支持它。




Refer: Cross-domain Ajax with Cross-Origin Resource Sharing - ncz
兼容性
                ie6   ie7   ie8      ie9   chrom   firefox   safari
                                           e

xd xhr          no    no    XDom     yes   yes     yes       yes
                            ainReq
                            uest

withCredentia   no    no    no       yes   yes     yes       Yes
ls

solution        swf   swf   swf      xhr   xhr     xhr       xhr

Mais conteúdo relacionado

Mais procurados

scrapy+sphinx搭建搜索引擎
scrapy+sphinx搭建搜索引擎scrapy+sphinx搭建搜索引擎
scrapy+sphinx搭建搜索引擎Ping Yin
 
Redis 常见使用模式分析
Redis 常见使用模式分析Redis 常见使用模式分析
Redis 常见使用模式分析vincent253
 
NoSQL误用和常见陷阱分析
NoSQL误用和常见陷阱分析NoSQL误用和常见陷阱分析
NoSQL误用和常见陷阱分析iammutex
 
Hdfs raid migration to hadoop 1.x
Hdfs raid migration to hadoop 1.x Hdfs raid migration to hadoop 1.x
Hdfs raid migration to hadoop 1.x Jiang Yu
 
分布式爬虫
分布式爬虫分布式爬虫
分布式爬虫drewz lin
 
QCon - 一次 Clojure Web 编程实战
QCon - 一次 Clojure Web 编程实战QCon - 一次 Clojure Web 编程实战
QCon - 一次 Clojure Web 编程实战dennis zhuang
 
一个 Mongodb command 的前世今生
一个 Mongodb command 的前世今生一个 Mongodb command 的前世今生
一个 Mongodb command 的前世今生dennis zhuang
 
统一接入的架构思考
统一接入的架构思考统一接入的架构思考
统一接入的架构思考yang bingwu
 
Mongo db 簡介
Mongo db 簡介Mongo db 簡介
Mongo db 簡介昱劭 劉
 
Ch8 file system management(2013 ncu-nos_nm)
Ch8   file system management(2013 ncu-nos_nm)Ch8   file system management(2013 ncu-nos_nm)
Ch8 file system management(2013 ncu-nos_nm)Kir Chou
 
nodejs在微博前端开发中的应用
nodejs在微博前端开发中的应用nodejs在微博前端开发中的应用
nodejs在微博前端开发中的应用dong yuwei
 
NoSQL-MongoDB介紹
NoSQL-MongoDB介紹NoSQL-MongoDB介紹
NoSQL-MongoDB介紹國昭 張
 
Php及drupal性能优化系列(二)
Php及drupal性能优化系列(二)Php及drupal性能优化系列(二)
Php及drupal性能优化系列(二)Robbin Zhao
 
Buffer pool implementaion inno db vs oracle
Buffer pool implementaion inno db vs oracleBuffer pool implementaion inno db vs oracle
Buffer pool implementaion inno db vs oraclefrogd
 
几种Nosql介绍
几种Nosql介绍几种Nosql介绍
几种Nosql介绍taotao1240
 
Redis 介绍 -田琪
Redis 介绍 -田琪Redis 介绍 -田琪
Redis 介绍 -田琪Shaoning Pan
 
高性能Web服务器Nginx及相关新技术的应用实践
高性能Web服务器Nginx及相关新技术的应用实践高性能Web服务器Nginx及相关新技术的应用实践
高性能Web服务器Nginx及相关新技术的应用实践Frank Cai
 
高性能Web服务器Nginx及相关新技术的应用实践
高性能Web服务器Nginx及相关新技术的应用实践高性能Web服务器Nginx及相关新技术的应用实践
高性能Web服务器Nginx及相关新技术的应用实践rewinx
 

Mais procurados (20)

scrapy+sphinx搭建搜索引擎
scrapy+sphinx搭建搜索引擎scrapy+sphinx搭建搜索引擎
scrapy+sphinx搭建搜索引擎
 
Redis 常见使用模式分析
Redis 常见使用模式分析Redis 常见使用模式分析
Redis 常见使用模式分析
 
NoSQL误用和常见陷阱分析
NoSQL误用和常见陷阱分析NoSQL误用和常见陷阱分析
NoSQL误用和常见陷阱分析
 
Hdfs raid migration to hadoop 1.x
Hdfs raid migration to hadoop 1.x Hdfs raid migration to hadoop 1.x
Hdfs raid migration to hadoop 1.x
 
分布式爬虫
分布式爬虫分布式爬虫
分布式爬虫
 
QCon - 一次 Clojure Web 编程实战
QCon - 一次 Clojure Web 编程实战QCon - 一次 Clojure Web 编程实战
QCon - 一次 Clojure Web 编程实战
 
一个 Mongodb command 的前世今生
一个 Mongodb command 的前世今生一个 Mongodb command 的前世今生
一个 Mongodb command 的前世今生
 
统一接入的架构思考
统一接入的架构思考统一接入的架构思考
统一接入的架构思考
 
Mongo db 簡介
Mongo db 簡介Mongo db 簡介
Mongo db 簡介
 
Ch8 file system management(2013 ncu-nos_nm)
Ch8   file system management(2013 ncu-nos_nm)Ch8   file system management(2013 ncu-nos_nm)
Ch8 file system management(2013 ncu-nos_nm)
 
nodejs在微博前端开发中的应用
nodejs在微博前端开发中的应用nodejs在微博前端开发中的应用
nodejs在微博前端开发中的应用
 
NoSQL-MongoDB介紹
NoSQL-MongoDB介紹NoSQL-MongoDB介紹
NoSQL-MongoDB介紹
 
Php及drupal性能优化系列(二)
Php及drupal性能优化系列(二)Php及drupal性能优化系列(二)
Php及drupal性能优化系列(二)
 
Buffer pool implementaion inno db vs oracle
Buffer pool implementaion inno db vs oracleBuffer pool implementaion inno db vs oracle
Buffer pool implementaion inno db vs oracle
 
几种Nosql介绍
几种Nosql介绍几种Nosql介绍
几种Nosql介绍
 
伪静态
伪静态伪静态
伪静态
 
Redis 介绍 -田琪
Redis 介绍 -田琪Redis 介绍 -田琪
Redis 介绍 -田琪
 
Mongo db 特性
Mongo db 特性Mongo db 特性
Mongo db 特性
 
高性能Web服务器Nginx及相关新技术的应用实践
高性能Web服务器Nginx及相关新技术的应用实践高性能Web服务器Nginx及相关新技术的应用实践
高性能Web服务器Nginx及相关新技术的应用实践
 
高性能Web服务器Nginx及相关新技术的应用实践
高性能Web服务器Nginx及相关新技术的应用实践高性能Web服务器Nginx及相关新技术的应用实践
高性能Web服务器Nginx及相关新技术的应用实践
 

Semelhante a 你不知道的HTTP 之 跨域XHR

用戶端攻擊與防禦
用戶端攻擊與防禦用戶端攻擊與防禦
用戶端攻擊與防禦Taien Wang
 
Rest与面向资源的web开发
Rest与面向资源的web开发Rest与面向资源的web开发
Rest与面向资源的web开发topgeek
 
讓軟體開發與應用更自由 - 使用 Docker 技術
讓軟體開發與應用更自由 - 使用 Docker 技術讓軟體開發與應用更自由 - 使用 Docker 技術
讓軟體開發與應用更自由 - 使用 Docker 技術Yu Lung Shao
 
Real time web实时信息流推送
Real time web实时信息流推送Real time web实时信息流推送
Real time web实时信息流推送yongboy
 
Real-Time Web实时信息流推送
Real-Time Web实时信息流推送Real-Time Web实时信息流推送
Real-Time Web实时信息流推送yongboy
 
Javascript加载总结
Javascript加载总结Javascript加载总结
Javascript加载总结衡锋 阳
 
白玉磊 Webrebuild
白玉磊 Webrebuild白玉磊 Webrebuild
白玉磊 Webrebuild裕波 周
 
石玉磊 Web rebuild
石玉磊 Web rebuild石玉磊 Web rebuild
石玉磊 Web rebuildWebrebuild
 
互联网创业服务器运维工具集
互联网创业服务器运维工具集互联网创业服务器运维工具集
互联网创业服务器运维工具集zhen chen
 
Artifacts management with CI and CD
Artifacts management with CI and CDArtifacts management with CI and CD
Artifacts management with CI and CDChen-Tien Tsai
 
網路安全20140911@INFOR
網路安全20140911@INFOR網路安全20140911@INFOR
網路安全20140911@INFORAlexander Shieh
 
移动端Web开发性能优化实践
移动端Web开发性能优化实践移动端Web开发性能优化实践
移动端Web开发性能优化实践Mingel Zhang
 
Web coding principle
Web coding principleWeb coding principle
Web coding principleZongYing Lyu
 
Lamp架构下的web开发
Lamp架构下的web开发Lamp架构下的web开发
Lamp架构下的web开发ops_bd
 
浅析浏览器解析和渲染
浅析浏览器解析和渲染浅析浏览器解析和渲染
浅析浏览器解析和渲染Ailsa126
 
运维系统开发与Rails 3页面开发实践
运维系统开发与Rails 3页面开发实践运维系统开发与Rails 3页面开发实践
运维系统开发与Rails 3页面开发实践Li JianYe
 
高性能Web服务器Nginx及相关新技术的应用实践
高性能Web服务器Nginx及相关新技术的应用实践高性能Web服务器Nginx及相关新技术的应用实践
高性能Web服务器Nginx及相关新技术的应用实践self study
 

Semelhante a 你不知道的HTTP 之 跨域XHR (20)

Html5
Html5Html5
Html5
 
用戶端攻擊與防禦
用戶端攻擊與防禦用戶端攻擊與防禦
用戶端攻擊與防禦
 
Rest与面向资源的web开发
Rest与面向资源的web开发Rest与面向资源的web开发
Rest与面向资源的web开发
 
讓軟體開發與應用更自由 - 使用 Docker 技術
讓軟體開發與應用更自由 - 使用 Docker 技術讓軟體開發與應用更自由 - 使用 Docker 技術
讓軟體開發與應用更自由 - 使用 Docker 技術
 
Real time web实时信息流推送
Real time web实时信息流推送Real time web实时信息流推送
Real time web实时信息流推送
 
Real-Time Web实时信息流推送
Real-Time Web实时信息流推送Real-Time Web实时信息流推送
Real-Time Web实时信息流推送
 
Javascript加载总结
Javascript加载总结Javascript加载总结
Javascript加载总结
 
白玉磊 Webrebuild
白玉磊 Webrebuild白玉磊 Webrebuild
白玉磊 Webrebuild
 
石玉磊 Web rebuild
石玉磊 Web rebuild石玉磊 Web rebuild
石玉磊 Web rebuild
 
互联网创业服务器运维工具集
互联网创业服务器运维工具集互联网创业服务器运维工具集
互联网创业服务器运维工具集
 
Artifacts management with CI and CD
Artifacts management with CI and CDArtifacts management with CI and CD
Artifacts management with CI and CD
 
網路安全
網路安全網路安全
網路安全
 
網路安全20140911@INFOR
網路安全20140911@INFOR網路安全20140911@INFOR
網路安全20140911@INFOR
 
移动端Web开发性能优化实践
移动端Web开发性能优化实践移动端Web开发性能优化实践
移动端Web开发性能优化实践
 
Node分享 展烨
Node分享 展烨Node分享 展烨
Node分享 展烨
 
Web coding principle
Web coding principleWeb coding principle
Web coding principle
 
Lamp架构下的web开发
Lamp架构下的web开发Lamp架构下的web开发
Lamp架构下的web开发
 
浅析浏览器解析和渲染
浅析浏览器解析和渲染浅析浏览器解析和渲染
浅析浏览器解析和渲染
 
运维系统开发与Rails 3页面开发实践
运维系统开发与Rails 3页面开发实践运维系统开发与Rails 3页面开发实践
运维系统开发与Rails 3页面开发实践
 
高性能Web服务器Nginx及相关新技术的应用实践
高性能Web服务器Nginx及相关新技术的应用实践高性能Web服务器Nginx及相关新技术的应用实践
高性能Web服务器Nginx及相关新技术的应用实践
 

你不知道的HTTP 之 跨域XHR

  • 1. 跨域 XHR 你不知道的 HTTP RDSS 小组 2012-04
  • 2. 作者 沉鱼 fool2fish@gmail.com http://fool2fish.cn
  • 3. 关于 RDSS Research on Domain Specific Solution 我们致力于已有的规范、解决方案、产品等研究 并实践到工作中
  • 5. 目录 • Ajax 结构 • 参考资料 • 简单请求 • Preflight 请求 • 带验证的请求 • 兼容性
  • 6. Ajax 结构 Ajax getScript jsonp Xhr Same Cross origin domain Get post Get post
  • 7. 参考资料 • Cross-Origin Resource Sharing – w3c • Cross-domain Ajax with Cross-Origin Resource Sharing - ncz • HTTP access control (CORS) – mdn • http://arunranga.com/examples/acces s-control/ (demo)
  • 8. • Cross-Origin Resource Sharing (CORS)是W3c工作草案,它定义了在 跨域访问资源时浏览器和服务器之间 如何通信。CORS背后的基本思想是 使用自定义的HTTP头部允许浏览器和 服务器相互了解对方,从而决定请求 或响应成功与否。
  • 10. 浏览器 • 对一个简单的请求,没有自定义头部, 要么使用GET,要么使用POST,它的 Content-type为text/plain,请求会发送 一个名叫Orgin的额外的头部。 例:Origin: http://fool2fish.cn Refer: Cross-domain Ajax with Cross-Origin Resource Sharing - ncz
  • 11. 服务器 • 如果服务器确定请求被通过,它将发 送一个Access-Control-Allow-Origin头 部响应发送请求的同一个源,如果是 一个公共资源,则返回“*”。 例:Access-Control-Allow-Origin: http://fool2fish.cn Refer: Cross-domain Ajax with Cross-Origin Resource Sharing - ncz
  • 12. • 注意,请求和响应都不包括cookie信 息。 Refer: Cross-domain Ajax with Cross-Origin Resource Sharing - ncz
  • 13. • FF3.5 +,Safari 4和chrome通过使用 XMLHttpRequest对象支持其使用。在 IE8中也是一样,用同样的方式你需要 使用XDomainRequest对象。 Refer: Cross-domain Ajax with Cross-Origin Resource Sharing - ncz
  • 15. Browser • 除了GET或POST,通过一种称之为 preflighted请求的服务器透明验证机制, CORS允许使用自定义的头部和方法,以 及不同主体内容类型。当你尝试使用高级 选项中的一个来试着建立一个请求时,这 时就建立了一个preflighted请求。该请求 使用可选的方法,并发送如下头部: – Origin – Access-Control-Request-Method – Access-Control-Request-Headers Refer: Cross-domain Ajax with Cross-Origin Resource Sharing - ncz
  • 16. Server • 在请求期间,服务器能决定是否允许 这类请求。服务器通过在响应中发送 以下头部来与浏览器通信。 – Access-Control-Allow-Origin – Access-Control-Allow-Methods – Access-Control-Allow-Headers – Access-Control-Max-Age Refer: Cross-domain Ajax with Cross-Origin Resource Sharing - ncz
  • 17. • preflighted 请求一旦作出,结果将按 响应中规定的时间缓存下来;第一次 做出这样的请求,你将引发一次额外 的HTTP请求。 • Firefox 3.5+, Safari 4+和Chrome都支 持preflighted 请求,IE8则不支持。 Refer: Cross-domain Ajax with Cross-Origin Resource Sharing - ncz
  • 19. Browser • 默认状态下,跨域请求不提供证书 (cookie、HTTP身份验证、客户端SSL 证书)。你可以规定一个请求应该通过设 置withCredentials属性为true来发送证书。 如果服务器允许credentialed请求,那么 它将用下面的头部作出响应: 例:Access-Control-Allow-Credentials: true Refer: Cross-domain Ajax with Cross-Origin Resource Sharing - ncz
  • 20. Server • 如果一个credentialed请求被发送,而 这个头部没在响应头中相应的返回, 浏览器不会将响应传递给 JavaScript(responseText是一个空字 符串,状态为0,onerror()被调用)。 Refer: Cross-domain Ajax with Cross-Origin Resource Sharing - ncz
  • 21. • IE8不支持withCredentials属性,irefox 3.5+, Safari 4+和Chrome都支持它。 Refer: Cross-domain Ajax with Cross-Origin Resource Sharing - ncz
  • 22. 兼容性 ie6 ie7 ie8 ie9 chrom firefox safari e xd xhr no no XDom yes yes yes yes ainReq uest withCredentia no no no yes yes yes Yes ls solution swf swf swf xhr xhr xhr xhr