项目中请求接口遇到跨域,前端可以使用代理服务器解决跨域:
就是在web浏览器和请求服务器之间增加一个中间服务器,这个服务器和你web端始终保持一致的协议,域名,端口号,所以这个中间服务器与你web端之间不存在跨域问题。
请求发给这个中间服务器,让这个中间的服务器代理浏览器去向请求服务器要数据,因为服务器之间不存在跨域,所以当中间代理服务器拿到数据之后,再把数据给浏览器即可。
具体的写法:
在vue项目中的根目录下新建Vue.config.js,在里面写:
module.exports = {devServer: {proxy: {/api: { //请求前缀 用于强制向请求服务器要数据target: :5000,//请求服务器域名 端口号ws: true, changeOrigin: true,//当请求服务器询问来自哪里 true:和服务器一样,false:来自于被代理代理的pathRewrite:{^/api:}//在服务器去掉前缀}}}}使用:
发请求时,发给代理服务器(和本地始终一样),加上前缀/api
axios.get(http:localhost:8080/api/user).then(res=> {console.log(res)}).catch(error=> {console.log(error)});其中的 前缀 /api :
写什么可以自定义,他的作用是于强制向请求服务器要数据,如果不加前缀,那么浏览器要数据时会先向链接的第一个服务器要数据,如果代理服务器(其实就是本地)里面本身就有你要的那个接口名一样的数据,那就默认直接返回代理服务器里的数据了,不会再想真实的服务器去请求数据了,这样的话就拿不到想要的数据了。而加上前缀,不管你本地有没有这个数据,他都会去向请求服务器要数据。
如果你就是想拿到本地的数据,那不加前缀就行了。
不加前缀/api,拿到代理服务器原有的数据
axios.get(http:localhost:8080/user).then(res=> {console.log(res)}).catch(error=> {console.log(error)});pathRewrite :
这个必须配置,因为代理服务器请求的时候带了一个前缀/api,这个前缀只是为了在前端识别是否强制请求,但是在服务端就不需要了。
如果不加pathRewrite这个属性,这个前缀/api就会带给服务器端,例如api/user,而服务端的接口本身是没有/api/user的,人家本身是 /user,此时你加了一个/api,那么服务端就找不到你要的数据了,返回找不到数据。
这个问题,加上 pathRewrite:{^/api:} 这个配置就可以解决了,他的作用就是在服务器去掉前缀。
changeOrigin: true :
这个属性可以理解为 是否向服务端撒谎。
因为代理服务器向服务端请求数据时,服务端会询问来自于哪里?如果 changeOrigin: true 撒谎, 那么意思就是我和你一样,你服务端的协议域名端口是什么,那我就是什么,这样服务端就能把数据给出来,否则如果 changeOrigin: false 实话实说, 意思就是我来自于被代理的服务器localhost,是他让我来问你要数据给他的,这时,如果服务端有专门配置, 和服务端不同的来源拒绝给出数据,那此时就完了,拿不到数据了,因为你和服务端源不一样,我是 ,你是localhost 那可定就是不一样了。
所以,这个属性一般都设为true,始终和服务端源一样。