同源策略:
当然同源策略限制也不是绝对隔离不同源的站点,比如link、img、script标签都没有跨域限制,这让我们开发更灵活了
CORS跨域
1、请求方法是以下三种方法之一:
HEAD、GET、POST
2、HTTP的头信息不超出以下几种字段:
Accept
Accept-Language
Content-Language
Last-Event-ID
Content-Type:只限于三个值application/x-www-form-urlencoded、multipart/form-data、text/plain (不包括application/json)
简单请求:浏览器直接发出CORS请求。具体来说,就是在头信息之中,增加一个Origin字段
GET /cors HTTP/1.1
Origin: http://api.bob.com
Host: api.alice.com
Access-Control-Allow-Origin: http://api.bob.com //表示接受哪些域名的请求
Access-Control-Allow-Credentials: true //表示是否允许发送Cookie
Access-Control-Expose-Headers: FooBar
//CORS请求时,XMLHttpRequest对象的getResponseHeader()方法只能拿到6个基本字段:Cache-Control、Content-Language、Content-Type、Expires、Last-Modified、Pragma。
//如果想拿到其他字段,就必须在Access-Control-Expose-Headers里面指定。上面的例子指定,getResponseHeader('FooBar')可以返回FooBar字段的值
非简单请求:
var url = 'http://api.alice.com/cors';
var xhr = new XMLHttpRequest();
xhr.open('PUT', url, true);
xhr.setRequestHeader('X-Custom-Header', 'value');
xhr.send();
//"预检"请求的HTTP头信息:
OPTIONS /cors HTTP/1.1 Origin: http://api.bob.com
Access-Control-Request-Method: PUT
//指定浏览器CORS请求会额外发送的头信息字段
Access-Control-Request-Headers: X-Custom-Header
Access-Control-Allow-Origin: http://api.bob.com
Access-Control-Allow-Methods: GET, POST, PUT
Access-Control-Allow-Headers: X-Custom-Header
预检测之后