在用vue开发,运行vue-cli-service本地调试时,如果想对接后端的接口,浏览器会提示CORS Access-Control-Allow-Origin问题。
浏览器跨域是我们在开发过程中经常遇到的问题,常用的方法有jsonp,但jsonp只支持get方式,我们可以使用CORS解决浏览器跨域的问题。
照网上的方法,在PHP代码里面设置头消息,我用的是ThinkPHP框架,写在了action里面,但仍旧报跨域错误。
header('content-type:application:json;charset=utf8'); header("Access-Control-Allow-Origin:http://127.0.0.1");//允许访问的域名 header('Access-Control-Allow-Methods:POST');//跨域请求方式 header('Access-Control-Allow-Headers:x-requested-with,content-type');
后来,我把它放到class之前,命名空间之后,便解决了使用CORS浏览器跨域的问题。
为什么会出现跨域:
浏览器访问非同源的网址时,会被限制访问,出现跨域问题.
常见的跨域有三种:
jspn跨域,原理:动态生成script标签,通过script标签引入接口地址(因为script标签不存在跨域的)
cors跨域(后端开启) :全称 “跨域资源共享”,原理:它允许浏览器向跨源服务器,发出XMLHttpRequest请求,从而克服了AJAX只能同源使用的限制
vue代理服务器proxy跨域:通过请求本地的服务器,然后本地的服务器再去请求远程的服务器(后端部署接口的服务器),最后本地服务器再将请求回来的数据返回给浏览器(本地服务器和浏览器之前不存在跨域)
两个关键点:
本地服务器(利用node.js创建的本地服务器进行代理,也叫代理服务器)和浏览器之间不存在跨域
服务器和服务器之间不存在跨域
话不多说,直接上代码:
修改vue.config.js文件
// 假设要请求的接口是:http://40.00.100.100:3002/api/user/add module.exports = { devServer:{ host:'localhost', // 本地主机 port:5000, // 端口号的配置 open:true, // 自动打开浏览器 proxy:{ '/api': { // 拦截以 /api 开头的接口 target: 'http://40.00.100.100:3002',//设置你调用的接口域名和端口号 别忘了加http changeOrigin: true, //这里true表示实现跨域 secure: false, // 如果是https接口,需要配置这个参数 pathRewrite: { '^/api':'/' //这里理解成用‘/api’代替target里面的地址,后面组件中我们掉接口时直接用api代替 比如我要调用'http://40.00.100.100:3002/api/user/add',直接写‘/api/user/add’即可 } }, // 假如又有一个接口是:http://40.00.100.100:3002/get/list/add // 那就再配置一个 get的,如下: '/get': { // 拦截以 /get 开头的接口 target: 'http://40.00.100.100:3002',//设置你调用的接口域名和端口号 别忘了加http changeOrigin: true, //这里true表示实现跨域 secure: false, // 如果是https接口,需要配置这个参数 pathRewrite: { '^/api':'/' //这里理解成用‘/api’代替target里面的地址, } } // 调用的时候直接 /get/list/add 就可以了 } } } // 注意:修改了配置文件后一定要重启才会生效;
如果上面不行,再下面的
devServer: { // host: 'localhost', port: 8080, open: true, overlay: { warnings: false, errors: true }, proxy: 'http://40.00.100.100:3002',//开发调试用:设置开发接口地址 }