vue项目中常用解决跨域的方法
Posted 是大林的林吖
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了vue项目中常用解决跨域的方法相关的知识,希望对你有一定的参考价值。
一、什么是跨域?
跨域问题的出现是因为浏览器的同源策略问题。所谓同源就是必须有以下三个相同点:协议相同、主机相同、端口相同。如果其中有一项不同,即出现非同源请求,就会产生跨域。当我们请求一个接口的时候,出现如:Access-Control-Allow-Origin 字眼的时候说明请求跨域了
二、如何解决跨域?
跨域的解决方案:
jsonp
cors
Node中间件代理(两次跨域) 即 Proxy
nginx反向代理 CORS支持所有类型的HTTP请求,是跨域HTTP请求的根本解决方案
JSONP只支持GET请求,JSONP的优势在于支持老式浏览器,以及可以向不支持CORS的网站请求数据。
不管是Node中间件代理还是nginx反向代理,主要是通过同源策略对服务器不加限制。
日常工作中,用得比较多的跨域方案是cors和nginx反向代理
主要解释CROS和Proxy两种方式
1、CROS
- CROS是 Cross-Origin Resource Sharing的缩写,翻译过来就是跨域资源共享的意思。它由一系列传输的HTTP头组成,这些HTTP头会决定浏览器是否阻止前端 JavaScript代码获取跨域请求的响应。
- CORS的实现比较简单方便,只需要增加一些 HTTP头,让服务器能声明允许的访问来源。只要后端实现了 CROS就实现了跨域。
2、Proxy(代理)
- 通过启动本地服务器进行代理转发目标服务器。而跨域只针对于浏览器,对于node服务发出的请求是不会出来跨域的,从而解决了跨域的问题。
- 在vue.config.js文件
1、可配置多个不同的proxy
devServer:
proxy:
'/api': //代理标识,一般是每个接口前的相同部分
target: 'http://23.15.11.15:8000', // 这里写的是访问接口的域名和端口号
changeOrigin: true, // 允许跨域请求
pathRewrite: // 重写路径,替换请求地址中的指定路径
'^/api': '/user'
,
'/login':
target: 'http://23.15.11.15:8000',
changeOrigin: true,
pathRewrite:
'^/login':'' //替换成空
,
示例:
- http://localhost:8080/api/test --> http://23.15.11.15:8000/user/test
- http://localhost:8080/login/index–> http://23.15.11.15:8000/index
2、对所有的接口都代理
devServer:
proxy: 'http:/www.ljc.com'
示例:
- http://localhost:8080/api/test --> http://www.ljc.com/api/test
- http://localhost:8080/login/index–> http://www.ljc.com/login/index
Vue项目中跨域问题的解决
参考技术A在Web端Vue项目开发过程中,跨域问题是不可避免的;在我参与的Vue项目中,使用服务器代理的解决方案;针对不同的环境(开发环境/生产环境),采用了不同的服务器代理方案;
服务器代理的原理大概是这样:
代理服务器和访问源(请求端)是同源的,但和被访问服务器(资源端)是不同源的,但服务器之间的访问不受浏览器同源策略的影响(即不必担心是否有跨域问题),那么我们即可请求到同源服务器上的从被访问服务器上的获取到的请求资源了 ;
这样配置完成后,我们发起的每次http请求的Request Url的前面一部分都会和我们本地的源一样;
举例:
我们项目跑在开发环境下的 http://localhost:8080 上,那么上述请求的Request Url的就是 http://localhost:8080/api/bookCate ;这应该就是我们的代理服务器中该资源的地址,与客户端同源;而数据的实际来源则是 http://219.216.5.26:8080/api/bookCate ,这样即实现代理跨域;
目前猜测这个代理服务器可能是Node;
nginx 版本: 1.16.1
修改 nginx.conf 文件下的 serve 下配置:
举例:
生产环境下的,我们项目跑Nginx服务器监听的 http://localhost:8088 上,那么上述请求的Request Url的就是 http://localhost:8088/api/bookCate ;
这应该就是我们的代理服务器中该资源的地址,与客户端同源;
而数据的实际来源则是 http://219.21.5.5:9903/api/bookCate ,这样即实现代理跨域;
以上是关于vue项目中常用解决跨域的方法的主要内容,如果未能解决你的问题,请参考以下文章
Vue.js学习—— 分别从前后端Nginx解决SpringBoot+vue.js项目中的跨域问题
如何解决Vue.js里面noVNC的截图问题——论可以跨域的webSocket