vue項目與node後台,解決跨域問題

1 跨域問題總概述

跨域指的是从一个域名到另一个域名去请求资源,跨域名请求同源策略,浏览器的安全机制,跨域是浏览器的行为,不是服务器的行为;

简化来讲就是,网页(浏览器)向后台服务器发送一个请求之后,浏览器会拦截这个请求,并检查这个请求是不是跨域访问,如果是跨域访问,便要向服务器端核对,是否允许这个请求进行跨域访问,如果允许,则把请求发送出去,如果不允许,则报错。

所以我们解决这个问题的办法就是,要么在后台加上允许跨域访问的中间件,要么在前台发送请求时,加上允许跨域访问的配置;

2 後台解決   (只需要添加一個中間件就可以),一般情况下,需要对跨域中间件进行相应的配置,只允许特定的请求跨域;

const express = require("express");
const cors = require("cors");
const app = express();

// 这样就允许所有的服务器端的请求进行跨域访问了 app.use(cors()); app.post(
"/cross-origin", function (req, res) { res.json({ message: "跨域問題解決成功", }); }); app.listen(3000);

 

3 前台解決   (在vite配置中添加代理配置)

import { defineConfig } from "vite";
import vue from "@vitejs/plugin-vue";

// https://vitejs.dev/config/
export default defineConfig({
  plugins: [vue()],
  server: {
    // 这个代理配置的简要意思就是,对target服务器上以cross-origin开头的url请求,允许跨域访问;
    proxy: {
      // 拦截以cross-origin开头的接口地址
      "/cross-origin": {
        // 向(指定)目标服务器发送的请求
        target: "http://localhost:3000",
        // 是否开启允许跨域
        changeOrigin: true,
      },
    },
  },
});

这里有一个需要注意的事项,在前端配置好代理之后,前端发送请求时,对于配置好的代理请求,不能访问完整的url,而只能访问去除target之后的url,因为会自动拼接到target上,如果写了完整的url之后,这个url便不是以/cross-origin开头了,便捕获不到这个请求,也就无法进行允许跨域访问的配置了。代码如下:

<script setup>
import axios from "axios";

const postTest = async function () {
  const response = await axios.post("/cross-origin", {});
  console.log(response.data.message);
};
</script>

 

posted @ 2024-01-06 13:05  0龙行者0  阅读(8)  评论(0编辑  收藏  举报