一、跨域问题解释

跨域问题是指在一个域名下,访问另一个域名的资源时出现了限制,这种限制是由浏览器实行了同源策略所引起的。

所谓同源即同协议、同域名、同端口,只要有一个不同就是跨域了。

二、常用解决跨域问题的方法

1. CORS(Cross-Origin Resource Sharing)

CORS基于HTTP头部添加可访问的域名地址来进行跨域请求,相对于自己上前端开发的人员只需配置请求后台API的路径即可。如下:


axios({
    method: 'get',
    url: 'https://api.apiopen.top/getJoke?page=1&count=2&type=video'
    withCredentials: true //后端要设置Access-Control-Allow-Credentials: true 才能访问
}).then(res=> {
      console.log(res)
})

其原理是在浏览器中发起请求时,在请求头部中添加Origin字段标记本次请求的来源域名,服务器端在处理请求之后添加Access-Control-Allow-Origin: *标识跨域接受哪些域名可以带cookie发出请求。

2. 代理

webpack代理,或者前段nginx代理,可以让请求变成本地请求来解决跨域问题,也能防止客户端请求时直接访问第三方服务器;同时请求的代理也可以在本地开发时模拟接口数据。


"proxy": {
    "/api": {
      "target": "https://api.apiopen.top", //代理的后台
      "changeOrigin": true,
      "pathRewrite": {"^/api": ""}//这个不解释
    }
} 

3. JSONP

JSONP利用的是页面的script标签跨域请求不受浏览器同源策略的限制来获取数据,通过写回调函数,数据会当做参数传递到回调函数中,再通过回调函数来操作拿到的数据。

4. nginx反向代理

nginx可以做网关,同时也作为反向代理,将请求按照配置转发到对应的后台服务器,同时可以在nginx上设置CORS。

5. postMessage通信

window.postMessage(message, targetOrigin)方法是用来来自不同域的窗口之间的通信的。例如,假设文档 A 包含一个,该 来自文档 B,如果在 的 Javascript 中调用了 window.postMessage() 方法,那么,文档 A 中用于监听的 JavaScript 代码能够接收到消息。

三、实际应用

根据实际情况选择使用以下解决跨域问题的方式,对于后端设置了CORS的情况可以直接使用axios,对于不允许前端直接访问后端接口的情况使用代理,对于只支持JSONP方式的可以使用第三方库jsonp引用,对于已经有nginx服务器的可使用nginx反向代理,对于iframe嵌套的,可以使用postMessage或者window.name进行传递数据。

这里是示例代码,使用CORS和代理解决Axios跨域问题的实现:

CORS方式


axios({
  url: "https://api.apiopen.top/getJoke",
  method: "get",
  withCredentials: true,
  headers: { "Access-Control-Allow-Origin": "*" }
}).then(res => {
  console.log(res.data);
});

代理方式


axios({
  url: "/api/getJoke",
  method: "get"
}).then(res => {
  console.log(res.data);
});

以上就是解决axios跨域问题的几种方式了,根据实际需求进行选择。希望可以为大家提供帮助。