13518219792

建站动态

根据您的个性需求进行定制 先人一步 抢占小程序红利时代

纯前端解决跨域问题

背景

跨域是由浏览器的同源策略引起的,是指页面请求的url地址,必须与浏览器上的url地址处于同域上(即域名,端口,协议相同)。

这是为了防止某域名下的接口被其他域名下的网页非法调用,是浏览器对JavaScript施加的安全限制。

这个措施的出发点是好的,但是程序页面开发的过程中,却常常给前端开发者带来麻烦。

由于前端开发过程中,静态资源是放在本地电脑上的,访问这些资源通常通过IP方式(127.0.0.1)或者localhosts来访问,与线上服务器所在域名不符,不能顺利调用服务的端口。

解决跨域问题常用的解决方案有这两个:

但是这两个跨域方案都存在一个致命的缺陷,严重依赖后端的协助。

开发中遇到的每一个接口都需要提前找后端进行特殊的处理。而且即使后端愿意帮忙,某些接口不是随便就能开放的(譬如已经在上线正式环境的接口)。

无论如何,依赖后端协助的跨域解决方案都会在一定程度上限制前端开发的进度。

那么有没有前端独立就能实现的跨域方案呢?有的,我们可以利用「代理」或「反向代理」技术来实现开发中的跨域问题。

代理与反向代理

代理

代理,也称正向代理,意思是一个位于客户端和目标服务器(target server)之间的服务器,为了从目标服务器取得内容,客户端向代理发送一个请求并指定目标(目标服务器),然后代理向目标服务器转交请求并将获得的内容返回给客户端。

通俗地说:

说白了,小弟就是个跑腿的,代理大佬的需求。

数据流程:

应用:

最经典的应用就是科学上网:我是一个国内用户,我访问不了google,但是我能访问一个香港的某个代理服务器。

这个香港的代理服务器可以访问google,于是我先把请求发送到那个代理服务器,告诉他我需要访问google,代理服务器去取内容,最后返回给我。

就好比,大佬被抓起来坐牢了,不能出去买酱排骨,只好拜托小弟去买回来。

反向代理

百度百科的解释如下:

反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。

数据流程:

通俗地说:

「浏览器」可以看作食客,「【反向代理服务器-》处理数据的服务器】」这一个整体可以看作饭店,其中「反向代理服务」相当于点单的服务员。「处理数据的服务器」可以理解为是厨师。

在外部看来,「代理服务器」和「处理数据的服务器」是一个整体。就好比,食客只会去饭店吃饭,而不是去找厨师吃饭(即对于浏览器来说,到达反向代理服务器已经完成任务了,后面的操作则由反向代理服务器负责)。

具体饭店怎么操作,对食客是透明的。有可能某个服务员即当服务器也当厨师(即反向代理服务器和处理数据的服务器是同一台PC机)。

补充一下,没有反向代理,就好比没有了服务员,食客直接向厨师要吃的。譬如,你饿了,直接叫妈妈做饭是一样的(少了下订单的步骤)

比较

从用途上来讲:

从安全性来讲:

从使用方来看:

利用代理实现跨域

实现原理

对正向代理服务器进行配置,当获取非接口数据时,让代理服务器指向开发者本机的资源。当访问接口时,访问后端接口数据。

相当于大佬让小弟把酱排骨饭里面的饭和酱排骨分开买,饭自己家煮,酱排骨才去饭店买。

程序运行过程

代理配置(以mac下的charles为例)

注意:

利用反向代理实现跨域

反向代理需要用到nginx,其详细介绍请看 http://www.nginx.cn/doc/http://www.nginx.cn/doc/

实现原理

原理大体相同,但是处理的端不同,反向代理实在服务器端进行处理。首先修改hosts文件,将域名指向开发者的电脑本身,

把自己伪装成服务端,再通过nginx对不同的请求进行转发,把静态资源指向开发者本地电脑的资源,将接口指向实际的服务器。

相当于把饭店设置在了黑社会的楼下,去楼下买酱排骨饭的时候,饭店饭自己做,酱排骨则偷偷跑去别的饭店买。

代理配置

程序运行过程

简单的对比


名称栏目:纯前端解决跨域问题
分享网址:http://cdbrznjsb.com/article/cdijjsd.html

其他资讯

让你的专属顾问为你服务