资讯专栏INFORMATION COLUMN

前端跨域解决方案

JouyPub / 1651人阅读

摘要:跨域源资源共享同源域名端口协议均相同基本思想是使用自定义的头部,让服务器能声明允许访问的来源。简单请求所有的跨域请求简单或非简单总会包含一个的请求头部由浏览器添加不受用户控制。

跨域源资源共享

同源:域名、端口、协议均相同
CORS基本思想是使用自定义的HTTP头部,让服务器能声明允许访问的来源。
使用CORS时,异步请求会被分为简单请求(非Preflight)和非简单请求。

简单请求

所有的跨域请求(简单或非简单)总会包含一个origin的请求头部,由浏览器添加不受用户控制。值由协议、域名、端口组成,说明请求的来源。下面为一个Origin头部示例:

Origin:http://www.hello.com

服务器接受这个请求,会在响应头Access-Control-Allow-Origin回发相同的源信息。( * 表明该资源可以被任意外域访问)

Access-Control-Allow-Origin:http://www.hello.com
非简单请求

非简单CORS请求会在正式请求之前发送一次Preflight请求,得到确认之后才会发送真正的XMLHttpRequest请求。浏览器自动处理这两个请求,并且Preflight请求结束后,结果将按照响应中指定的时间缓存起来.所以只是第一次发送这种请求时会多一次HTTP请求.
Preflight请求使用OPTIONS方法,发送下列头部:

Origin:与简单请求相同
Access-Control-Request-Method:请求自身使用的方法

以下是一个带有自定义头部Custom-Header的使用POST方法发送的请求.

Origin:http://www.hello.com
Access-Control-Request-Method:POST
Access-Control-Request-Headers:Custom-Header
var url = "http://www.hello.com";
var xhr = new XMLHttpRequest();
xhr.open("POST", url, true);
xhr.setRequestHeader("Custom-Header", "value");
xhr.send();

服务器通过在响应中发送如下头部与浏览器沟通:

Access-Control-Allow-Origin:http://www.hello.com
Access-Control-Allow-Methods:POST,GET
Access-Control-Allow-Headers:Custom-Header
Access-Control-Allow-Max-Age:28000  //表示将Preflight缓存的时长(秒),期间内无需再次发送预请求

另外通过将XMLHttpRequest的withCredentials属性设置为true就可以发送带凭据(cookie、HTTP认证、客户端SSL证明等)的跨域请求.

var xhr=new XMLHttpRequest();
xhr.withCredentials=true;

如果服务器接受带凭据的请求会用下面的HTTP头部响应:

Access-Control-Allow-Credentials:true
JSONP(JSON with padding)

JSONP由两部分组成:回调函数+数据,回调函数是当响应到来时应该在页面中调用的函数,回调函数的名字一般是在请求中指定的.而数据就是传入回调函数中的JSON数据.JSONP是通过动态

阅读需要支付1元查看
<