跨域

656 阅读2分钟

零. 跨域是什么

跨域指的是浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器对javascript施加的安全限制。

一. 同源

源=协议+域名+端口号

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

比如 : baidu.comwww.baidu.com不同源的。
比如 : qq.combaidu.com 是不同源的。

两者要完全一致才同源!

window.originlocation.origin可以得到当前源

二 .同源策略

首先同源策略是一个浏览器的功能,浏览器就是这么设计的,目的是保护用户隐私

如果运行在同源网页里,那就是同源访问,即:如果JS运行在源A里,那么就只能获取源A的数据,不能获取源B的数据,即不允许跨域。

不同源的页面之间,不允许相互访问数据!!!

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

因为同源策略限制的是数据访问,引用是不限制的。我们跨域引用JS、CSS或图片等等的时候,其实并不能获取它们的具体内容,我们只是在引用。所以跨域是可以使用JS、CSS或图片等的。比如我们不能获取引用的js或css的具体代码。

三、如何实现跨域共享数据

两个方法:CORS、JSONP

  • 方法一:CORS (IE不支持)
    CORS方法就是在一个网站的响应头里写明哪些网站可以访问
    具体语法:Access-Control-Allow-Origin:foo.example

举例:

具体语法参考MDN文档

  • 方法二:JSONP (IE支持)
    首先JSONP和JSON没任何关系。JSONP只能知道请求成功或失败,它拿不到状态码。

所以,JSONP是什么?

我们在跨域时由于当前浏览器不支持CORS,所以我们使用JSONP来跨域。于是我们就请求一个JS文件,这个JS文件会执行一个回调,回调里面就有我们的数据。回调的名字是一个随机数,以callback的名字传给后台,后台会把这个函数返回给我们并执行。JSONP方法就是创造一个script,请求另外一个网站的js,js再把数据夹带过来,这些数据会在我们的网站上调用一个全局函数运行。
优点:兼容IE,可以跨域。
缺点:由于是script标签,只能发get请求,不支持POST。所以它读不到状态码和响应头,只知道成功和失败。