端口跨域的问题解决

368 阅读2分钟

关于 vue-cli2.x 的端口跨域的问题解决

什么是跨域?

首先解释一下什么是同源策略

同源策略:   
     a.前端发送请求时,浏览器的安全策略   
     b.url的 协议名、域名、端口号 必须完全一致   

个人理解:违背同源策略,就会产生跨域问题,所以会出现以下三种跨域的方式。

跨域的三种方式

1、协议跨域即 只有http 和 https 不同
例:http://localhost:8080/ https://localhost:8080/
2、域名跨域即 只有http:// 或 https:// 到端口之间的那一段东西不同
例:http://www.baidu.com:8080 http://www.zhihu.com:8080
3、端口跨域即 只有端口不同
例:http://localhost:8080/ http://localhost:3000/

场景:(端口跨域问题解决)

前端地址:http://localhost:8080/
后端接口地址:http://localhost:3000/users

组件中用到封装的axios

看到这些代码不要头晕只要关注标注的主要代码那一行即可 *********主要代码***********

//封装axios
//导入axios
import axios from "axios";
//创建axios实例化对象
const service = axios.create({
  //设置baseURL可以自动添加到封装的url里
  
  baseURL: "",//*********主要代码***********
  
  //设置响应时间
  timeout: 3000,
  //设置请求头的格式
  headers: {
    "Content-Type": "application/json;charset=utf-8"
  }
});

//设置请求拦截
service.interceptors.request.use(
  function(res) {
    //请求前处理
    return res;
  },
  function(error) {
    //对请求错误进行处理
    return Promise.reject(error);
  }
);

//设置响应拦截
service.interceptors.response.use(
  function(rep) {
    //对响应的处理
    return rep;
  },
  function(error) {
    //对响应错误的处理
    Promise.reject(error);
  }
);
//抛出
export default service;

在其他组件中的craeted方法内调用封装的aixos发送请求到后端接口

created() {
    this.service
      .get("/api/users")//*********主要代码***********
      .then(res => {
        console.log(res);
      })
      .catch(err => {
        console.log(err);
      });
    console.log(data);
  }
};

解决方法: 在 项目/config/index.js 中加入以下代码:

1656954015467.png

//*********主要代码***********
proxyTable: {
      "/api": {
        target: "http://localhost:3000",
        changeOrigin: true,
        pathRewrite: {
          "^/api": "" //这里理解成用'/api'代替target里面的地址
        }
      }
    },

个人理解:通过在index.js中设置,让/api可以替换为http://localhost:3000,供请求中的url使用。

问题解决思路:

首先发生报错,先不要慌,百度一下到底是什么问题,就比如说,我百度了这个错误,是跨域问题,那什么是跨域呢,再进一步百度,得到三种跨域问题,再进一步思考,我的这个问题属于哪一个跨域问题,是端口跨域,结果照着其他大佬的解决方案做还是解决不了,再百度,发现我用的居然是vue-cli3.x的解决方案!!!最终百度到了vue-cli2.x的解决方案才得以解决。明确问题根源很重要!!!

以上纯个人理解,本人只是一名小白,有错误请大家指正,希望对大家有帮助