跨域、JSONP、CORS

146 阅读2分钟

首先要提一下浏览器的同源策略,这是浏览器故意设置的功能限制:

同源策略定义:不同源的页面间不能互相访问数据,这是浏览器为了保护用户的隐私,故意这样设计的。

源 = 协议 + 域名 + 端口号

如果两个url的协议、域名、端口号完全一致,那么这两个url就是同源的。

举例: qq.comwww.qq.com 并不同源

跨域的定义:指在不同域之间进行数据传输,协议、域名或者端口的其中一个不同都算跨域。

但为什么跨域可以使用CSS、JS和图片等?

答:同源策略限制的是数据访问。我们引用CSS、JS和图片的时候,并不知道它们的内容,只是引用。

JSONP、CORS都是用来实现跨域的。

JSONP跨域

只支持GET请求,不支持POST等其它请求,也不支持复杂请求,只支持简单请求。

CORS跨域

支持所有的请求,包含GET、POST、OPTOIN、PUT、DELETE等。既支持复杂请求,也支持简单请求。

JSONP和CORS的使用目的: JSONP与CORS的使用目的相同,并且都需要服务端和客户端同时支持,但CORS的功能更加强大。

CORS(跨域资源共享)

浏览器说,如果要共享数据,需要提前声明。在localhost:8888 响应头里写 localhost:9999 可以访问。

语法:

Access-Control-Allow-Origin:http://foo.example
response.setHeader('Access-Control-Allow-Origin', 'http://localhost:9999')

JSONP:

跨域时,由于浏览器不支持CORS,必须使用另外一种方式来跨域,于是我们请求一个JS文件,这个JS文件会进行回调,回调里面就有我们的数据。回调的名字是可以随机生成的一个随机数,我们把这个数以callback的参数传给后台,后台会再次把这个数返回给我们并执行。

优点:兼容IE、可以跨域

缺点:由于它是script标签,无法读取ajax那样精确的状态,只能知道成功或失败。且它只能发GET请求,不支持POST。