同源策略几乎是前端面试中几乎必然问到的问题。但是很多同学对同源策略的理解不够深入,今天我们就来聊聊同源策略的问题。
首先按照老规矩,我们先来提出几个问题:
1. 什么是同源?
2. 为什么要有同源策略?
一句话解释同源就是:相同协议,相同域名,相同端口称为同源。
下面我们还是用邓哥抄作业的故事来讲述什么是同源策略。
话说邓哥大学时候号称比较“浪漫~”,因为很“浪”,也很“慢”。。。邓哥每天都写不完作业,只能每天到学校去抄同学的。如果说学霸在知识的海洋里开快艇,那么邓哥只能在知识的海洋里喂鲨鱼。。
有一天邓哥早上匆匆忙忙进到教室,向绿茶妹妹(欧阳绿茶)借了数学作业来抄。
这时邓哥就相当于是浏览器,一个url我们可以分为几个部分,比如http://pan.baidu.com:80。绿茶妹妹就像是一个服务程序,绿茶妹妹姓欧阳,欧阳是姓,就相当于url中的主域(baidu.com),绿茶是名,就像是上面url中的子域(pan),一个主机可以有很多端口,就相当于是很多科目的作业,数学作业英语作业之类的,由于一般的服务都占用的是默认的80端口,所以我们一般情况下是看不到端口号的。
绿茶妹妹还有个亲妹妹,叫红茶妹妹(欧阳红茶)~
红茶妹妹和绿茶妹妹是一家的~所以肯定都姓欧阳,只是名字不同,就像是pan.baidu.com(百度网盘)和zhidao.baidu.com(百度知道)的关系。
这天红茶妹妹也没写完作业,也想抄绿茶妹妹的作业,因为作业在邓哥这里,所以来向邓哥来借绿茶妹妹的作业。但是邓哥不敢把作业借给别人,所以邓哥没有借给红茶妹妹。
虽然红茶妹妹和绿茶妹妹都姓欧阳,但是毕竟不是同一个人,这就像是http://pan.baidu.com和http://zhidao.baidu.com虽然都是百度旗下的,但是浏览器并不会直接允许http://zhidao.baidu.com访问http://pan.baidu.com的内容。这就说明子域不同不算同源。
但是毕竟是一家的,其实红茶妹妹劝说邓哥一阵也是可以借到作业的~
虽然浏览器认为http://pan.baidu.com和http://zhidao.baidu.com不是同域,但是毕竟都是一家的,所以在浏览器端进行一些设置之后,还是可以访问到的。这是跨域的一种方式,我们下一篇文章来详细介绍跨域的多种方式。
由于数学老师查作业查的严,英语老师查作业查的松。所以绿茶妹妹提前和邓哥说了,英语作业可以借给别人,但是数学作业绝对不可以。
虽然不同的作业(端口)都是同一个域下的,但是同源策略不一定相同。所以就会出现,不同端口不算同源的现象。可能80端口不允许别人访问,但是90端口就有可能允许任何人访问。这个谁能访问,可以是由服务端(绿茶妹妹)设置的,这也是跨域的一种方式,我们后续详细的来讲。
绿茶妹妹比较心细,虽然英语作业可以随便借给别人,但是绿茶妹妹怕借给其他男生会把作业本弄坏,所以绿茶妹妹跟邓哥说,英语作业只能借给女生,不能借给男生~
这时候,https协议就好比是女生,http协议好比是男生,协议不相同不能访问,所以协议不同也不算同源。
所以总的来说,协议,子域,主域,端口任意一个不同,都不算同源,但并不意味着不算同源就完全不能访问,这就是跨域的知识,我们下篇文章再来为大家详细介绍跨域的多种方式。