解决vue跨域问题

118 阅读2分钟

解决vue跨域问题

了解跨域

什么是跨域

说到这块就有一个点需要知道:同源策略。

什么是同源策略:就是因为Ajax安全的考虑,不允许访问不同域名下的资源即所谓的同源测略的意思。

跨域请求就是指:当前发起请求的域与该请求指向的资源所在的域不一样,凡是发送请求的url的 协议、域名、端口号三者之间任意一者与当前页面地址不同的请求。这里的域指的是这样的一个概念:我们认为若协议 + 域名 + 端口号均相同,那么就是同域。

产生跨域的原因

产生跨域的情况有:不同协议,不同域名,不同端口以及域名和IP地址的访问

解决方案

跨域的解决方案目前有三种主流的解决方案

JSONP

实现原理:主要是利用动态创建script标签请求后端接口地址,然后传递callback参数,后端接收,经过后端数据处理,然后返回callback函数调用的形式,callback中的参数就是json。

proxy代理

实现原理:我在vue中使用vue.config,js里面配置一个proxy,里面有个target属性指向跨域链接,修改完后重启项目即可。

CORS

CORS全称跨域资源共享,主要是后台工程师设置后端代码来达到前端跨域请求。

我们在这里是使用代理的方式结合.env文件来实现。

.env文件配置

普通文件就可以交.env,可以配置多个。 我在这里使用的是axios请求和vue框架。

文件内容:

VUE_APP_SERVER_URL='http://localhost:3000/'
//这里配置的公共路由
VUE_APP_BASE_URL='/api'
//代理名称

config文件配置

const { defineConfig } = require('@vue/cli-service')
module.exports = defineConfig({
  transpileDependencies: true,
  devServer: {
    proxy: {
      [process.env.VUE_APP_BASE_URL]: {
        target: process.env.VUE_APP_SERVER_URL,
        ws: true,
        changeOrigin: true,
        pathRewrite: { ["^" + process.env.VUE_APP_BASE_URL]: "" },
      },
    },
  },
});
//process.env.VUE_APP_BASE_URL替换掉axios中的baseUrl

一定记得重启项目

package.json

  "scripts": {
    "serve": "vue-cli-service serve",
    //默认启动
    "serve:prod": "vue-cli-service serve --mode production",
    //指定启动,启动方式就是npm run serve:prod必须加后缀。
    //production是.env文件的后缀,如.env.production
    "build": "vue-cli-service build"
  },

然后重新启动项目就行了。