一、问题的产生
在项目开发过程中遇到了一个问题,访问图片与访问其他的数据的服务器不是同一个,虽然后台已经将两个服务器合并到一个,但是前台配置好后访问就会产生了一个问题,具体报错如下:
![](https://img-blog.csdnimg.cn/img_convert/5a4f9419f49b9323cc4911e04a578284.png)
简单来说就是跨域问题,经过我的求助和努力,找到了解决的方法,用反向代理。
二、反向代理的原理和能解决的问题
2.1什么是跨域呢?
跨域问题的出现是因为浏览器的同源策略问题,所谓同源:就是两个页面具有相同的协议(protocol),主机(host)和端口号(port),它是浏览器最核心也是最基本的功能,如果没有同源策略我们的浏览器将会十分的不安全,随时都可能受到攻击。
当,协议名,域名,端口号,三者有一个不同都会发生跨域问题。
这里强调一点:发生了跨域,并不是请求没有发送出去,它是请求发送成功了,并且服务端也给你把数据返回了,但是浏览器为了安全性给拒绝了。
2.2反向代理的原理
代理服务是指内部网络对Internet发出连接请求,需要制定代理服务将原本直接传输至Web服务器的HTTP发送至代理服务器中。换句话来说,代理服务就是网络信息的中转站。代理服务器作为浏览器与Web服务器之间的另一类服务器,配备代理服务器,浏览器无需直接至Web服务器获取网页,只需向代理服务器发出所需的请求,由代理服务器传送给访问者所需的浏览器。普通的Web代理服务器仅支持内部网络的访问请求,反向代理服务与普通的代理方法并不存在明显冲突。如果一个代理服务器可以代理外部网络主机访问内部网络,这类代理服务模式称之为反向代理服务。
反向代理的工作原理是,代理服务器来接受客户端的网络访问连接请求,然后服务器将请求有策略的转发给网络中实际工作的业务服务器,并将从业务服务器处理的结果,返回给网络上发起连接请求的客户端。
就好比:
当你拨打10086,每次都是不同的客服在接听,我们也不需要关心电话那边是谁,只要能够解答问题即可
这里10086总机号码就是我们说的反向代理。我们作为客户方,不知道真正提供服务的人是谁
也就是说,反向代理隐藏了真实的服务端
三、VUE中反向代理的配置
找到vue.config.js文件,如果没有就自己手动配置。
![](https://img-blog.csdnimg.cn/img_convert/eef12b1dfa4cc79e1997e6c485745b8e.png)
配置反向代理
![](https://img-blog.csdnimg.cn/img_convert/7b99583f0169b2aaabc762980a032a56.png)
之后在request.js中,将环境变量baseURL配置为
![](https://img-blog.csdnimg.cn/img_convert/00bf481fc72a67c8ecae012a9dc952c9.png)
之后正常配置接口,调取接口就可以了!
但是:
开发阶段才会使用proxy反向代理,线上项目一般是使用nginx来实现
这里插一下,由于我访问的是图片,返回的数据和正常的数据不一样,所以在配置接口的时候:指定返回数据类型是“Blob”。
![](https://img-blog.csdnimg.cn/img_convert/5f2235da92e086311f943b7c3b106da7.png)
最后在页面调用:
![](https://img-blog.csdnimg.cn/img_convert/a96d46063f42415a7699f7a4b73f96d6.png)
“Bolb”数据类型在后台显示是这样的
![](https://img-blog.csdnimg.cn/img_convert/c2c8f9619e151066c79df435bce6c6a2.png)
在这个时候,图片我们已经拿到了
![](https://img-blog.csdnimg.cn/img_convert/c4c0d80dd003c0ef08a7e5925e56c015.png)
但是在页面我们还无法显示,想要展示出来我们需要转换。
所以这里再插一下:解决这个数据类型的方法
转换为url:
![](https://img-blog.csdnimg.cn/img_convert/770bde620566673e8180d2ac113f91f9.png)
转换为base64格式:
![](https://img-blog.csdnimg.cn/img_convert/615f3aa96a74519c5148963757f8e4e2.png)
![](https://img-blog.csdnimg.cn/img_convert/22544f52903841487884b6e26d7d7175.png)
两种都可以直接放在img标签的src中的
只不过打印出来
url长这个样子:
![](https://img-blog.csdnimg.cn/img_convert/0580ddf18174ab900100a94b28f94a3d.png)
而base64是这个样子的:
![](https://img-blog.csdnimg.cn/img_convert/3861522012e3e2bdd478b404e7fb57aa.png)
两个方法展示出来的效果是一样的。所以用哪个都就可以!
![](https://img-blog.csdnimg.cn/img_convert/dfcfdef3f46a1e9baef88c79d470d8b8.png)
好啦!
到此我的问题就解决了,我所能分享的也就这些了!
最后在此强调一下,这篇文章仅限于我在我现在项目中遇到的问题,解决的方法,不够严谨和专业,所以在实践中若遇到什么问题就请就实际问题解决,请不要批评这篇文章!
在此感谢各位的阅读,鞠躬!撒花!