一文带你理解同源、跨域、JSONP、CORS

30 阅读2分钟

1. 什么是同源?

要搞懂同源,首先就得知道什么是源。

当你在浏览器输入window.origin或location.origin就可以得到当前的源。

控制台输入:location.origin
得到的结果:'https://www.baidu.com'

源的结构是这样的:

源 = 协议 + 域名 + 端口号(默认是80就不写)

同源

现在你就了解什么是源了,那么同源,顾名思义。

同源:如果两个url的协议、域名、端口号完全一致,那么这两个url就是同源的。同源政策是浏览器故意设计的一个功能限制。

下面举个例子:

	https://qq.com、https://www.baidu.com不同源
        
	https://baidu.com、https://www.baidu.com不同源

只有协议、域名、端口号完全一致才同源。

这么做的优点就是:可以保护用户隐私(注意!是保护用户而不是服务器)

但是随之而来的缺点就是:会被浏览器住址获取其响应。

为了解决这个问题,就有跨域。

2. 什么是跨域?

跨域,就是浏览器由于同源策略不执行其他网站的脚本。是为了解决浏览器的同源策略所出现的。

3. JSONP和CORS

为了实现跨域,就出现了两种方式:JSONP和CORS。

1. JSONP

JSONP就是:跨域时,由于浏览器不支持,于是请求一个js文件进行回调,回调名字可以随机取的,是一个随机数,这个数以callback的参数传给后台,后台返回后能继续执行。

JSONP的优点:

  1. 支持IE
  2. 可以跨域

JSONP的缺点:

  1. 不能像ajax那么精确,即无法获取状态码等等
  2. 不支持post,因为他是script,只能发get请求

现在IE已经几乎绝迹,既然如此,为何不使用一个更加简单的方式?那就用CORS吧!

2. CORS

CORS就是跨域资源共享,是突破浏览器限制的一个方法。是为了解决浏览器默认不同源之间不能互相访问数据而产生的方法。

只需要是在网站的响应头里填写可以访问的网站名单,浏览器就会获得一个准许访问的名单,名单上的网站就能跨域访问。

请求又分为简单请求和复杂请求。

简单请求

简单请求有:GETHEADPOST

简单请求声明语法:Access-Control-Allow-Origin:http://for.wxample

复杂请求

复杂请求有:PATCH

复杂请求声明语法:

Access-Control-Allow-Origin: https://甲站点

Access-Control-Allow-Methods:POST、GET、OPTIONS、PATCH

Access-Control-Allow-Headers:Content-Type