首先要提一下浏览器的同源策略,这是浏览器故意设置的功能限制:
同源策略定义:不同源的页面间不能互相访问数据,这是浏览器为了保护用户的隐私,故意这样设计的。
源 = 协议 + 域名 + 端口号
如果两个url的协议、域名、端口号完全一致,那么这两个url就是同源的。
举例: qq.com 、www.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。