方案1:webpack
其他网址
json - Vue Axios CORS policy: No 'Access-Control-Allow-Origin' - Stack Overflow
webpack官网(devserverproxy)
基础
其他网址
GitHub - chimurai/http-proxy-middleware
vue-cli proxyTable中跨域中pathRewrite 怎么用
devServer
devServer:开发服务器代理。
proxyTable的pathRewrite
pathRewrite使用正则表达式
示例:
'proxyFor/abc':{ // 要代理的接口名
target:'http://siwei.me', // 要代理的根地址
changeOrigin:true, // 允许跨域
pathRewrite:{'^/abc':''} // 接口名重写
}
含义:^/abc应该拆分为“^”和“/abc”,“^”匹配字符串最开始的位置。
比如:/abc/def/gh;经过 http-proxy-middleware 的代理服务器时,会变成"/def/gh",与“target”拼接,组成:"http://siwei.me/def/gh"
使用代理之前
router/index.js
import Vue from 'vue'
import Router from 'vue-router'
import Axios from 'axios';
import VueAxios from 'vue-axios';
import FormSubmit from "@/components/FormSubmit";
Vue.use(Router)
Vue.use(VueAxios, Axios);
export default new Router({
routes: [
{
path: '/form_submit',
name: 'formSubmit',
component: FormSubmit
}
]
})
components/FormSubmit.vue
<template>
<div>
<textarea v-model='content'>
</textarea>
<br/>
<input type='button' @click='submit' value='留言'/>
</div>
</template>
<script>
export default {
data() {
return {
content: ''
}
},
methods: {
submit: function () {
this.axios.post('http://siwei.me/interface/blogs/add_comment',
{
content: this.content
}
)
.then((response) => {
alert("提交成功!, 刚才提交的内容是:" + JSON.stringify(response));
},
(response) => {
alert("出错了")
}
)
}
}
}
</script>
config/index.js
采用默认配置。
module.exports = {
dev: {
// Paths
assetsSubDirectory: 'static',
assetsPublicPath: '/',
proxyTable: {},
}
结果
使用代理之后
config/index.js
修改proxyTable
module.exports = {
dev: {
// Paths
assetsSubDirectory: 'static',
assetsPublicPath: '/',
proxyTable: {
'/abc':{ // 要代理的接口名
target:'http://siwei.me', // 要代理的接口地址
changeOrigin:true, // 允许跨域
pathRewrite:{'^/abc':''} // 接口名重写
}
},
}
可以代理所有 //下边这样配置时,接口是啥就写啥。对本处来说:this.axios.post('/interface/blogs/add_comment',
module.exports = {
dev: {
// Paths
assetsSubDirectory: 'static',
assetsPublicPath: '/',
proxyTable: {
'/':{ // 要代理的接口名。本处也可以用'**'
target:'http://siwei.me', // 要代理的接口地址
changeOrigin:true, // 允许跨域
}
},
}
可以配置多个代理接口的,就是普通的json格式。例如:
module.exports = {
dev: {
// Paths
assetsSubDirectory: 'static',
assetsPublicPath: '/',
proxyTable: {
'/abc':{ // 要代理的接口名
target:'http://siwei.me', // 要代理的接口地址
changeOrigin:true, // 允许跨域
pathRewrite:{'^/abc':''} // 接口名重写
},
'/def':{ // 要代理的接口名
target:'http://siwei.me', // 要代理的接口地址
changeOrigin:true, // 允许跨域
pathRewrite:{'^/def':''} // 接口名重写
}
},
}
router/index.js(跟上边一样)
import Vue from 'vue'
import Router from 'vue-router'
import Axios from 'axios';
import VueAxios from 'vue-axios';
import FormSubmit from "@/components/FormSubmit";
Vue.use(Router)
Vue.use(VueAxios, Axios);
export default new Router({
routes: [
{
path: '/form_submit',
name: 'formSubmit',
component: FormSubmit
}
]
})
components/FormSubmit.vue
<template>
<div>
<textarea v-model='content'>
</textarea>
<br/>
<input type='button' @click='submit' value='留言'/>
</div>
</template>
<script>
export default {
data() {
return {
content: ''
}
},
methods: {
submit: function () {
this.axios.post('/abc/interface/blogs/add_comment',
{
content: this.content
}
)
.then((response) => {
alert("提交成功!, 刚才提交的内容是:" + JSON.stringify(response.data));
},
(response) => {
alert("出错了")
}
)
}
}
}
</script>
结果
方案2:@vue/cli 3
其他网址
跨域配置(@vue/cli官网)
简介
跟webpack-dev-server一样用(除了配置位置不一样以外)。
注意事项
配置http格式
其他网址
使用Vue的axios vue-resource跨域不成功 但原生xhr就可以
vue中使用axios的多种方式 - 简书
axios官网:https://github.com/axios/axios#using-applicationx-www-form-urlencoded-format
简介
axios 发送请求时的数据默认是 JSON 格式的。这是导致用 axios POST 跨域出错的主要原因。
根据 CORS 的标准,当浏览器发送跨域请求时,如果请求不是GET或者特定POST(Content-Type只能是 application/x-www-form-urlencoded, multipart/form-data 或 text/plain的一种)时,强烈要求浏览器必须先以 OPTIONS 请求方式发送一个预请求(preflight request),从而获知服务器端对跨源请求所支持 HTTP 方法。使用 axios 直接发送 POST 的跨域请求,如果web后端对 OPTIONS 的响应有问题,就会报错。
用 axios 解决跨域的方案和你类似,不过是先把 params 转换为字符串格式了,见上边的官方用x-www-form-urlencoded格式的说明。
实例: post方法使用application/x-www-form-urlencoded格式
1.设置 headers:{ 'Content-type': 'application/x-www-form-urlencoded'}
axios.post('url',data,{headers:{ 'Content-type': 'application/x-www-form-urlencoded'}})
// 不想在每次请求都设置的话,可以集中设置下
axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded; charset=UTF-8';
2.使用qs
仅仅第一步并没有达到想要的效果,post的body主体中还是{"age":10}这样的格式,并不是我们想要的query参数。引入Qs,这个库是axios里面包含的,不需要再下载了
import qs from 'qs';
import axios from 'axios';
let reqUrl = 'http://xxx.com';
let reqParams = {
name: 'aaa'
};
axios.post(url, qs.stringify({
params: reqParams
})).then(response => {
console.log(response);
})
其他
跨域的cookie丢失
axios默认是不让ajax请求头部携带cookie的,设置 axios.defaults.withCredentials = true 即可