前端开发如何独立解决跨域问题

时间:2017-08-25 01:00:33   收藏:0   阅读:532

背景

跨域是由浏览器同源策略引起的,是指页面请求的接口地址,必须与页面url地址处于同域上(即域名,端口,协议相同)。这是为了防止某域名下的接口被其他域名下的网页非法调用,是浏览器对JavaScript施加的安全限制。

这个措施出发点是好的,但在项目开发的过程中,常常给前端开发者带来麻烦。 由于页面开发中,静态资源是放在本地电脑上的,访问这些资源通常通过IP方式(127.0.0.1)或者localhosts来访问,与线上服务器所在域名不符,不能顺利进行接口调用。

技术分享

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

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

开发中遇到的每一个接口都需要提前找后端进行特殊处理。而且即使后端愿意帮忙,某些接口也不是随便能开放的(譬如已经在线上正式环境的接口)。 所以依赖后端协助的跨域解决方式都会在一定程度上限制前端的开发进度。

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

技术分享

代理与反向代理

代理

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

通俗地说:

「客户端」可以看作一个黑社会大佬,「目标服务器」可以看作一家饭店,「代理服务器」可以看作小弟。

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

技术分享

数据流程:

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

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

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

技术分享

反向代理

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

数据流程:

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

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

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

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

技术分享

比较

利用正向代理实现跨域

实现原理

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

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

程序运行过程

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

window上可使用fiddler实现相同功能,可参看这篇文章。

打开charles的映射关系表【charles->tool->Map Remote】。

技术分享

技术分享

点击add可以添加映射关系。

技术分享

点击 ? 符号,可以进入配置规则介绍页面。

技术分享

注意

技术分享

技术分享

利用反向代理实现跨域

反向代理需要用到nginx,其详细介绍请看这里

实现原理

原理大体相同,但是处理的端不同,反向代理实在服务器端进行处理。首先修改hosts文件,将域名指向开发者的电脑本身,把自己伪装成服务端,再通过nginx对不同的请求进行转发,把静态资源指向开发者本地电脑的资源,将接口指向实际的服务器。

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

代理配置

技术分享

技术分享

程序运行过程

简单的对比

 

https://mp.weixin.qq.com/s?__biz=MjM5NTEwMTAwNg==&mid=2650211701&idx=1&sn=2d2fcf3d6ed5b722bae7c93bb83d2a4f&chksm=befe055489898c4261d8b1cb380e0ac5075b5c9a7e803116c3b5e9068071c19f351fd476e017&mpshare=1&scene=2&srcid=0824gVAIO7UjHl9ryQb6lsjP&from=timeline#rd

 

原文:http://www.cnblogs.com/softidea/p/7425894.html

评论(0
© 2014 bubuko.com 版权所有 - 联系我们:wmxa8@hotmail.com
打开技术之扣,分享程序人生!