首页 > 其他分享 >Vue3全局配置Axios并解决跨域请求问题示例详解

Vue3全局配置Axios并解决跨域请求问题示例详解

时间:2024-07-03 14:57:07浏览次数:25  
标签:Axios http 跨域 示例 axios error import config

背景

对于前后端分离项目,前端和后端端口不能重复,否则会导致前端或者后端服务起不来。例如前端访问地址为: http://localhost:8080/ ,后端访问地址为 http://localhost:8081/ 。后端写好Controller,当用Axios访问该接口时,将会报错:

Access to XMLHttpRequest at ' http://localhost:8081/login ' from origin ' http://localhost:8080 ' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

本文内容从axios部署开始到解决跨域问题。

前端: Vue3;Axios 1.6.0 ;Element-Plus
后端:Springboot 2.7.14

这里提供两种解决方案,都是基于后端跨域访问的配置,前端不作任何允许跨域访问的设置,因为试过无效。

一、部署Axios

Axios的基本介绍:
(1)axios 是一个基于promise的HTTP库,支持promise所有的API
(2)浏览器端/node端(服务器端)都可以使用,浏览器中创建XMLHttpRequests
(3)支持请求/响应拦截器
(4)它可以转换请求数据和响应数据,并对响应回来的内容自动转换成 JSON类型的数据
(5)批量发送多个请求
(6)安全性更高,客户端支持防御XSRF

1. npm 安装 axios

npm install axios

2. 创建 request.ts,创建axios实例

在项目根目录下,也就是src目录下创建文件夹api/,并创建request.js ,该js用于创建axios实例。

import axios from 'axios';
import { ElMessage } from 'element-plus';
import { v4 as uuidv4 } from "uuid";

//ts使用
import { Md5 } from "ts-md5";


// 创建axios实例
const $http = axios.create({
  // 请求的域名,基本地址,proxy 代理时会将“/api”以及前置字符串会被替换为真正域名
   baseURL: '/api',
  // 跨域请求时发送Cookie
  withCredentials: true, // 视情况而定
  // 超时时间
  timeout: 5000,
  headers: {
    // 设置后端需要的传参类型
    'content-type': 'application/json; charset=utf-8',
    // "Lux-mateApiNonce": uuid, //每次调取接口生成的uuid
    // "Lux-mateApiSignature": mateApi, //md5(method+requestURI+nonce+timestamp+appId+appSecret)
    // "Lux-mateApiTimestamp": timestamp, // 每次调取接口的时间戳(秒级)
  }, 
});

// 请求拦截器
$http.interceptors.request.use((config) => {
    // 获取当前时间戳
    const timestamp = parseInt(Date.now() / 1000);
    const uuid =  uuidv4(); // 生成UUID
    console.log(parseInt(Date.now() / 1000),'3333333')
    // console.log(config.method)
    let signStr =config.method + config.url + uuid + timestamp + "Herdsric" + "Herdsric2024"
    console.log('验签',signStr)
    let mateApi = Md5.hashStr(signStr.toUpperCase());
    console.log(mateApi)
    config.headers['Lux-mateApiSignature'] = mateApi
    config.headers['Lux-mateApiNonce'] = uuid //每次调取接口生成的uuid
    config.headers['Lux-mateApiTimestamp'] = timestamp// 每次调取接口的时间戳(秒级)
    config.headers = config.headers || {};
    // if (localStorage.getItem("token")) {
    //     config.headers.token = localStorage.getItem("token") || "";
    // }
    return config;
  });
  
  // 响应拦截器
  $http.interceptors.response.use((response) => {
    return response;
  }, (error) => {
    ResponseProcessing(error);
  });
  
  /**
   * 响应处理
   * @param error 
   * @returns 
   */
  const ResponseProcessing = (error: { response: { state: any; data: any; }; }) => {
    if (error.response) {
      switch (error.response.state) {
        case 401:
          ElMessage.warning("资源没有访问权限!");
          break;
        case 404:
          ElMessage.warning("接口不存在,请检查接口地址是否正确!");
          break;
        case 500:
          ElMessage.warning("内部服务器错误,请联系系统管理员!");
          break;
        default:
          return Promise.reject(error.response.data); // 返回接口返回的错误信息
      }
    } else {
        ElMessage.error("遇到跨域错误,请设置代理或者修改后端允许跨域访问!");
    }
  };
  
  export default $http;

在这里,我们自定义axois实例化对象,配置了默认的访问i后端ip和端口等,并在末尾使用export 导出api配置,便于在其他单文件中引入 request.ts.

3. 在main.ts中全局注册axios

import { createApp } from 'vue'
import './style.css'
import App from './App.vue'
import router from './router'

import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'


const app = createApp(App)
app.use(ElementPlus)
app.use(router)
app.mount('#app')
// createApp(App).use(router).mount('#app')

4. 创建api.ts文件夹

import $http from './Interceptor';

export function getTestData(params: any) {
    return $http({
      url: '/',
      method: 'get',
      params
    })
  }

4. 在页面中使用axios

import { getTestData } from "../http/API";
const fetchUserData = async () => {
  try {
    let params = {
      
    };
    const response = await getTestData(params);
    if (response.data.code == 0) {
     
    } else {
     
    }
  } catch (error) {
    ElMessage.error("网络异常,请稍后再试");
    console.error("There was an error fetching the data:", error);
  }
};

4. 解决跨域问题。vite.config.ts

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

// https://vitejs.dev/config/
export default defineConfig({
  plugins: [vue()],
    // 解决跨域问题
  server: {
    host: '0.0.0.0',
    // port: 4000,
    proxy: {
      '/api': {
        target: 'http://192.168.31.17:4000',
        // secure: false, // 请求是否为https
        changeOrigin: true,
        rewrite:(path)=>path.replace(/^\/api/,'') //api替换为'',
      },
    },
  },



  // resolve: {
  //   alias: {
  //     '@': path.resolve(__dirname, 'src'),
  //   },
  // },
  css: {
    preprocessorOptions: {
      less: {
        additionalData: `@import "@/assets/style/base.less";`,
      }
    },
  },
})

标签:Axios,http,跨域,示例,axios,error,import,config
From: https://blog.csdn.net/aaa123aaasqw/article/details/140150795

相关文章

  • SQL的存储过程,语法示例
    存储过程类型含义IN作为输入,调用时需要传入值OUT作为输出,该参数作为返回值INOUT既可以输入参数,也可以输出参数 语法:创建createprocedure存储过程名称(in参数名称1参数数据类型,out参数名称2参数数据类型,i......
  • 邮件通知提醒邮箱设置教程及API代码示例!
    邮件通知的警告功能如何配置?详细教程与API代码示例!无论是业务提醒、账户活动警告,还是个人事务,邮件通知已经成为一种重要的沟通工具。AokSend将详细介绍如何设置邮件通知提醒邮箱,并提供相应的API代码示例,帮助你更高效地管理信息流。邮件通知:选择务提供商常见的有Gmail、Outl......
  • c语言函数指针和指针函数的区别及代码示例
    c语言函数指针和指针函数的区别及代码示例在C或C++中,函数指针和指针函数是两个容易混淆但本质不同的概念。理解它们的区别对于深入掌握C/C++的指针和函数特性至关重要。1.函数指针定义:函数指针是指向函数的指针。它存储了函数的地址,通过它可以调用该函数。语法:返回类型(*指......
  • 前端vue3项目dagre-d3基础配置项及流程图组件示例(包括安装依赖)
    目录引言d3是什么?dagre是什么?dagre-d3是什么?dagre-d3配置项流程图示例依赖安装组件示例总结引言因为很多文档都是英文,刚开始调研的时候比较费劲,文档里的配置像示例又比较分散,就自己整理了一下,附上测试时写的示例d3是什么?d3.js 是一个强大的JavaScript库,用于在......
  • dig 命令详解及使用示例
    一、背景知识CNAMECNAME是CanonicalName的缩写,它是DNS(域名系统)记录的一种类型。CNAME记录用于将一个域名映射(别名)到另一个域名。换句话说,当你访问一个设置了CNAME记录的域名时,你实际上被重定向到了另一个域名。例如,假设你有一个域名www.baidu.com,你想让用户通过examp......
  • 红队工具Finger 安装具体以步骤-示例centos
    1.gitclonehttps://github.com/EASY233/Finger.git如果没有yuminstallgit2.pip3install-rrequirements.txt找到finger所在的文件夹可以用find-name"Finger"进入文件中配置命令前提要安装pythonyuminstallpython-pip33.python3Finger.py-h......
  • Nginx跨域问题
    目录Nginx跨域实现跨域场景跨域问题的解决方案Nginx配置跨域解决Nginx跨域实现首先大家要搞清楚什么是跨域,为什么会有跨域情况的出现。哪些情况属于跨域?跨域:由于浏览器的同源策略,即属于不同域的页面之间不能相互访问各自的页面内容注:同源策略,单说来就是同协议,同域名,同端口UR......
  • 纳米体育数据电竞数据接口:基础数据包接口文档API示例③
    纳米体育数据的数据接口通过JSON拉流方式获取200多个国家的体育赛事实时数据或历史数据的编程接口,无请求次数限制,可按需购买,接口稳定高效;覆盖项目包括足球、篮球、网球、电子竞技、奥运等专题、数据内容。纳米数据API2.0版本包含http协议以及websocket协议,主要通过http获取数......
  • ONNX Runtime入门示例:在C#中使用ResNet50v2进行图像识别
    ONNXRuntime简介ONNXRuntime是一个跨平台的推理和训练机器学习加速器。ONNX运行时推理可以实现更快的客户体验和更低的成本,支持来自深度学习框架(如PyTorch和TensorFlow/Keras)以及经典机器学习库(如scikit-learn、LightGBM、XGBoost等)的模型。ONNX运行时与不同的硬件、......
  • 040【GD32F470】 灰度传感器移植成功示例
    【1TB嵌入式学习资料免费领取:https://link3.cc/sgzy】2.40灰度传感器2.40.1模块来源2.40.2规格参数工作电压:3.3V-5V工作电流:<20mA输出格式:模拟信号输出控制接口:ADC管脚数量:3Pin(2.54mm间距排针)2.40.3移植过程我们的目标是在梁山派GD32F470上能够判断当前环境......