前端axios+解决跨域proxyTable

使用proxyTable的理由很简单就是为了解决跨域

在平时项目的开发环境中,经常会遇到跨域的问题,尤其是使用vue-cli这种脚手架工具开发时,由于项目本身启动本地服务是需要占用一个端口的,所以必然会产生跨域的问题。当然跨域有多种解决方式,比如jsonp等等,在使用webpack做构建工具的项目中使用proxyTable代理实现跨域是一种比较方便的选择。

如何使用proxyTable

我采用的是vue init webpack xxx创建的项目

在根目录下config文件夹下的index.js文件。由于我们是在开发环境下使用,自然而然是要配置在dev里面:

dev: {

    // Paths
    assetsSubDirectory: 'static',
    assetsPublicPath: '/',
    proxyTable: {
    	"/":{
    		target:"http://47.106.164.90:8080",//目标接口域名

    		changeOrigin:true,//是否跨域
    	}
    },

    // Various Dev Server settings
    host: 'localhost', // can be overwritten by process.env.HOST
    port: 8080, // can be overwritten by process.env.PORT, if port is in use, a free one will be determined
    autoOpenBrowser: false,
    errorOverlay: true,
    notifyOnErrors: true,
    poll: false, // https://webpack.js.org/configuration/dev-server/#devserver-watchoptions-


    /**
     * Source Maps
     */

    // https://webpack.js.org/configuration/devtool/#development
    devtool: 'cheap-module-eval-source-map',

    // If you have problems debugging vue-files in devtools,
    // set this to false - it *may* help
    // https://vue-loader.vuejs.org/en/options.html#cachebusting
    cacheBusting: true,

    cssSourceMap: true
  },

上面这段代码的效果就是将本地3003端口的一个请求代理到了http://47.106.164.90:8080下:

前端axios:

this.$axios.post('/p/uploadFastaAndPredict',param).then(response =>{
			console.log(response.data.result[0],response.data.fasta[0]);
			alert("forecast finish!")
			this.result = response.data.result;
			this.totalCount = this.result.length;
			this.formAble = false;
			this.tableAble = true;
			this.loading = false;
			for(let i = 0; i< this.result.length; i++){
				this.res.push({
					Sequence: response.data.fasta[i],
					result: response.data.result[i] == 1?"yes":"no"
				})
			}
		})

关于proxyTable的原理

我在网上查了一下,这个代理实际上是利用http-proxy-middleware这个插件完成的,具体到这个插件的运行机制,由于是英文再加上能力有限就没深究了。但我想探究的是这种代理方式实际上是如何做到的,我看网上有人说实际上就是我们的本地服务器将请求转发给了目标服务器。之所以出现跨域是因为浏览器有同源策略的限制,但服务器是没有的,所以这种代理方式能够实现的机制大体就是:

本地服务器 --》 代理 --》目标服务器 --》拿到数据后通过代理伪装成本地服务请求的返回值 —》然后浏览器就顺利收到了我们想要的数据

你可能感兴趣的:(javascript,前端学习)