1、概念
通过XHR实现Ajax通信的一个主要限制,来源于跨域安全策略。默认情况与下,XHR 对象只能访问同一域中的资源。这种安全策略可以预防某些恶意行为。
但是,实现合理的跨域请求在现代web应用中还是很有必要的。
CORS (Cross-Origin Resource Sharing,跨域资源请求)是W3C 的一个工作草案,定义了在必须访问跨域资源时,浏览器与服务器应该如何沟通。
CORS 的基本思想,就是使用自定义的HTTP 头部让浏览器与服务器进行沟通,从而决定请求或响应是应该成功,还是失败。
比如一个简单的使用GET 或 POST 发送的请求,他没有自定义的头部,而主题内容是 text/plain。在请求发送请求时,需要给他附加一个额外的Origin头部,
其中包含请求页面的源信息,以便服务器根据这个头部信息来决定是否给予响应。
eg:
客户端(浏览器):Origin:http://www.baidu.com
服务器:Access-Control-Allow-Origin :http://www.baidu.com
2、CORS 的浏览器表现
(1)IE:IE8引入了一个XDR对象(XMLDomainRequest),来实现跨域。所有的XDR请求都是异步执行的,不能用它来创建同步请求。
(2)普通浏览器:WebKit 通过XMLHttpRequest 对象实现了对 CORS 的原生支持。
请求本地资源时,URL 使用相对路径。
请求跨域资源时,URL 使用决定路径。
(3)跨域请求的对象,都不能发送和接收Cookie
3、带凭证的请求
默认情况下,跨域请求不提供依据。通过将 withCredential 属性设置为 true,可以指定某个请求应该发送凭据。
如果服务器接收带凭据的请求,会用下面的 HTTP 头部响应。
Access-Control-Allow-Credentials:true。
4、JSONP
JSONP 是 JSON with padding 的简写,由两部分组成:回调函数和数据。
回调函数是当响应到来时应该再页面中调用的函数。回调函数的名字一般是在请求中指定的。而数据就是传入回调函数中的JSON数据。
如:
http://www.baidu.com/json?callback=handleResponse
这个URL是在请求一个JSONP地理定位服务。通过查询字符串来指定JSONP服务的回调参数是很常见的,这里指定的回调函数的名字是 handleResponse()