零. 跨域是什么
跨域指的是浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器对javascript施加的安全限制。
一. 同源
源=协议+域名+端口号
如果两个url的协议、域名和端口号完全一致,那么这两个url就是同源的!
比如 : baidu.com 和 www.baidu.com 是不同源的。
比如 : qq.com 和 baidu.com 是不同源的。
两者要完全一致才同源!
window.origin和location.origin可以得到当前源
二 .同源策略
首先同源策略是一个浏览器的功能,浏览器就是这么设计的,目的是保护用户隐私!
如果运行在同源网页里,那就是同源访问,即:如果JS运行在源A里,那么就只能获取源A的数据,不能获取源B的数据,即不允许跨域。
不同源的页面之间,不允许相互访问数据!!!
那为什么可以跨域使用JS、CSS或图片等等?
因为同源策略限制的是数据访问,引用是不限制的。我们跨域引用JS、CSS或图片等等的时候,其实并不能获取它们的具体内容,我们只是在引用。所以跨域是可以使用JS、CSS或图片等的。比如我们不能获取引用的js或css的具体代码。
三、如何实现跨域共享数据
两个方法:CORS、JSONP
- 方法一:CORS (IE不支持)
CORS方法就是在一个网站的响应头里写明哪些网站可以访问!
具体语法:Access-Control-Allow-Origin:foo.example
举例:
- 方法二:JSONP (IE支持)
首先JSONP和JSON没任何关系。JSONP只能知道请求成功或失败,它拿不到状态码。
所以,JSONP是什么?
我们在跨域时由于当前浏览器不支持CORS,所以我们使用JSONP来跨域。于是我们就请求一个JS文件,这个JS文件会执行一个回调,回调里面就有我们的数据。回调的名字是一个随机数,以callback的名字传给后台,后台会把这个函数返回给我们并执行。JSONP方法就是创造一个script,请求另外一个网站的js,js再把数据夹带过来,这些数据会在我们的网站上调用一个全局函数运行。
优点:兼容IE,可以跨域。
缺点:由于是script标签,只能发get请求,不支持POST。所以它读不到状态码和响应头,只知道成功和失败。