所谓的跨域是一种浏览器的安全机制导致的,也就是同源策略,如果出现非同源(协议、域名、端口号都相同,只要有一个不相同,那么都是非同源),浏览器就会形成跨域,比如说我们常见的一个端口去访问另一个端口的资源时,就会发出跨域请求,注意的是跨域是浏览器同源策略导致的,服务器与服务器之间没有跨域这个说法。
解决跨域的方法有很多,比如前端的代理服务器访问
JSONP 方案
使用 jsonp 实现,网页通过 script 标签去向服务器请求 json 数据,服务器收到请求后将数据放在一个指定名字的回调函数的参数里面传输给前端。
1 2 3 4 5 6 7 8 9 10 11
| <script src="http://www.test.com/getData?callback=getData"></script>
<script type="text/javascript"> function getData(res){ console.log(res.data) } </script>
|
Vue 中服务器代理
在 vue 的配置文件中:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| module.exports = { devServer: { open: true, port: "9595", proxy: { "/api": { target: "https://xxxxxxxx", changOrigin: true, pathRewrite: {
"^/api": "", }, }, }, }, };
|
在 configs.js 文件中,添加下面判断开发环境还是生产环境。更改 baseUrl
1 2 3 4 5 6 7
| const noAuthAxios = axios.create(); const authedAxios = axios.create();
const isPro = Object.is(process.env.NODE_ENV, "production");
authedAxios.defaults.baseURL = isPro ? process.env.VUE_APP_BASE_URL : "/api";
|
Express 中解决跨域问题
1 2 3 4 5 6 7 8 9
|
app.all("*", function (req, res, next) { res.header("Access-Control-Allow-Origin", "*"); res.header("Access-Control-Allow-Headers", "*"); res.header("Content-Type", "application/json;charset=utf-8"); res.header("Access-Control-Allow-Methods", "PUT, POST, GET, DELETE, OPTIONS"); next(); });
|
引入插件:
1 2 3 4 5 6
|
const cors = require("cors");
app.use(cors());
|