【Vue3+TS】Axios拦截器封装及跨域 [cors] 解决方案

news2025/7/7 14:12:30

【Vue3+TS】Axios拦截器封装及跨域 [cors] 解决方案

  • 简述
  • 封装过程
    • 文件路径
    • 拦截器封装 —— Interceptor.ts
    • API请求管理
  • 前端跨域的解决方案
  • 后端跨域的解决方案
  • 效果
  • 结语

简述

我的项目采用 Vue3+TypeScript+Vite+Element Plus 的组合,这个组合也是Vue版本退出3.x后官方推荐版本,给出的理由是Vue3的底层实现用的是TypeScript。
我这里用的包管理器是pnpm

Axios官方介绍:
Axios 是一个基于 promise 网络请求库,作用于node.js浏览器 中。 它是 isomorphic 的(即同一套代码可以运行在浏览器和node.js中)。在服务端它使用原生 node.js http 模块, 而在客户端 (浏览端) 则使用 XMLHttpRequests

Axios 包的安装
pnpm install axios --save

封装过程

文件路径

在项目的src文件夹下创建http文件夹
http文件夹包含 Interceptor.tsAPI.ts 两个文件
路径

拦截器封装 —— Interceptor.ts

import axios from 'axios';
import { ElMessage } from 'element-plus';

// 创建axios实例
const $http = axios.create({
  // 请求的域名,基本地址
  baseURL: 'https://localhost:7166',
  // 跨域请求时发送Cookie
  // withCredentials: true, // 视情况而定
  // 超时时间
  timeout: 5000,
  headers: {
    'content-type': 'application/json; charset=utf-8'
  }
});

// 请求拦截器
$http.interceptors.request.use((config) => {
  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;

进行最基础的封装,我个人认为易于调用的封装便是好的封装,适度即可以免造成过度封装。

API请求管理

import $http from './Interceptor';

export default {
  WeatherForecast() {
    return $http({ url: "/WeatherForecast", method: "get" });
  }
};

前端跨域的解决方案

在vite.config.ts文件中添加 proxy 配置

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

// https://vitejs.dev/config/
export default defineConfig({
  plugins: [
    vue(),
  ],
  server: {
    proxy: {
      "/api": { // “/api” 以及前置字符串会被替换为真正域名
        target: "https://localhost:7166/", // 请求域名
        secure: false, // 请求是否为https
        changeOrigin: true, // 是否跨域
        rewrite: (path) => path.replace(/^\/api/, "")
      }
    }
  }
});

proxy 配置中:坑爹的地方 secure 配置请求是否为https,这里指的是发起的请求,不是目标接口的请求是否为 https

后端跨域的解决方案

这里后端用的是 【C#】.net6 web api 默认项目模板为例。这么用的主要原因是,C#是我使用最熟练的编程语言。
.net6 中解决跨域也是十分的便捷,我这里配置允许所有,下面一起来看看吧

  • 在Program.cs文件中进行配置

需要注意两点:
1、添加cors配置
2、注册中间件

// 添加配置
builder.Services.AddCors(option =>
{
   option.AddPolicy("cors", builder =>
   {
       builder.AllowAnyMethod().SetIsOriginAllowed(_ => >true).AllowAnyHeader().AllowCredentials();
   });
});

// 注册中间件 AddPolicyName 要与前面一致
app.UseCors("cors");
  • 注意:如果需要用到UseMvc()中间件那么 UseCors() 一定要在 UseMvc() 之前,我这里没有用到所以注释掉

完整配置及插入点

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.

builder.Services.AddControllers();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();

// cors 跨域配置
builder.Services.AddCors(option =>
{
    option.AddPolicy("cors", builder =>
    {
        builder.AllowAnyMethod().SetIsOriginAllowed(_ => true).AllowAnyHeader().AllowCredentials();
    });
});

var app = builder.Build();

// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI();
}

// 注册中间件 AddPolicyName 要与前面一致
app.UseCors("cors");
// app.UseMvc();
app.UseHttpsRedirection();

app.UseAuthorization();

app.MapControllers();

app.Run();

效果

在这里插入图片描述

在这里插入图片描述

结语

跨域问题弄明白了还是很容易解决的,一般来说,只需要在一端解决跨域即可,并且一般建议使用后端跨域解决方案。
后面会单独出一篇后端跨域的多种解决方案和各种方案的适用范围以及如何选择最佳方案。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/18501.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

记一次服务宕机、优化全流程(以后也可以装X了)

视频地址: https://www.bilibili.com/video/BV1924y1y7jN 221115上午10点的时候客户反应进入小程序慢,打开监控发现服务pv已经超过了历史之最(印象中最高的是100w),这次到了400w。原因是因为推广了一个发红包的活动。 …

Java练习题第二十七期:幸运的袋子

作者:有只小猪飞走啦 博客地址:文章目录前言一,题目二,解析三,代码前言 本博客是小博主在做Java算法题的过程中一些觉得可以分享的题目,希望对你们有帮助,如果哪里写错了或者有更好的解法&…

详解Unity中的Nav Mesh新特性|导航寻路系统 (一)

前言 之前我们讲解过Unity的Nav Mesh系统,其中提到过这个新版的Nav Mesh,它解决现有Nav Mesh的几个缺陷,比如无法动态烘焙,无法按照Agent的半径和高度适当的判断可行路径。现在新版Nav Mesh可以彻底解决这个问题!某种…

实验送样、数据分析样品、组名命名规范

俗话说巧妇难为无米之炊,而样品就是“米”,没有样品,就无法开展实验,无法获得数据,无法毕业,无法发文章。鉴于样品的重要性,非常有必要对样品进行详细且规范的记录,方便他人也方便自…

Java 线上机器 CPU 100 的一次排查过程

文章目录1. 问题发生2. 数据库连接关闭问题排查3. 问题的进一步排查4. 解决方法1. 问题发生 日常敲代码突然收到生产环境异常告警,线上有一台机器 CPU 使用率飙升到 100 触发扩容,工作群里一下子鸡飞狗跳。 出现问题,首先当然是查看监控和日…

在群晖NAS上搭建导航页_通过Web Station搭建

一、业务需求 1.1、需求说明 我们在使用群晖NAS的过程中,随着时间的推移会安装各种各样的软件内容和管理工具,而这些内容又都是一些网页界面(特别是一些在Docker中搭建的工具)时间久了我们也记不住那么多工具的Web界面地址&#…

激活Windows时出现错误代码0xC004C003怎么办?

Windows是我们最常见的电脑操作系统,那么如果我们在尝试激活Windows时出现错误代码0xC004C003,应该如何解决? 什么是Windows激活错误0xC004C003,出现该错误的原因是什么? Windows操作系统为了抑制盗版软件&#xff0c…

3D建模就业前景如何?加班多吗?值不值得入行

加班其实都还好🤔,因为这个岗位是按照项目进度考核(算钱)的,老手做一个模型要5,6个小时,新手可能需要10个小时,新人刚入行,做东西效率跟不上😰需要加班来弥补是肯定有的事…

SpringMVC-整合详解

SpringMVC-整合详解 MVC 什么是MVC? 它是一种开发模式,它是模型视图控制器的简称。所有的web应用都是基于MVC开发的 M: 模型层,它是模型视图控制器的简称。所有的web应用都是基于MVC开发 V: 视图层,html、javascript、vue等都是视图层,用…

高校实验室设备管理系统设计与实现-计算机毕业设计源码+LW文档

数据库代码: /* Navicat MySQL Data Transfer Source Server : mysql5 Source Server Version : 50562 Source Host : localhost:3306 Source Database : ssmgxsyssbglxthsg3511cg ​ Target Server Type : MYSQL Target Server Versio…

Linux磁盘分区和管理

文章目录一 添加硬盘,创建Linux分区1.首先准备一块新的硬盘2.检查系统是否识别了硬盘3.对磁盘进行分区3-1 创建MBR磁盘分区3-2 创建文件系统3-3 挂载文件系统二 创建交换空间2-1 创建分区2-2 设置分区类型2-3 格式化交换空间2-4 激活交换空间三 删除磁盘的分区3-1 备…

【GPU】Nvidia CUDA 编程高级教程——利用蒙特卡罗法求解近似值(CUDA-Aware MPI)

博主未授权任何人或组织机构转载博主任何原创文章,感谢各位对原创的支持! 博主链接 本人就职于国际知名终端厂商,负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作,目前牵头6G算力网络技术标准研究。 博客…

11.24直播预告 | AIGC,看热闹不如看门道

如果把AI比作既富含能源,又无限神秘的海域,那么AIGC这条近半年内流经学术界和创投圈的支流,也无疑既带来了无数机遇,又蕴藏未知风险。 几天前,将门-TechBeat社区的专题(《AIGC的八大前沿创新》)…

Allegro基本规则设置指导书

Allegro基本规则设置指导书 下面介绍基本规则设置指导书之Analysis Modes 点击set-up-constrains-Modes 调出Analysis Modes,这个是所有DRC的总开关 下面介绍常用的一些开关设置 Design Options (Soldermask) 从上往下 阻焊到阻焊的间距 阻焊到pad和走线间距 阻焊到shape…

leecode #加一#二进制求和

题目描述: 给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。 最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。 你可以假设除了整数 0 之外,这个整数不会以零开头。 分析:对数…

简单版的采用前后端分离模式实现SpingBoot新增查询功能

目录 后端代码编写 前端代码编写 首页展示: 新增: 开发工具:IDEA、HbuilderX 技术点:后端:SpringBoot,前端:ElementUIvue,采用前后端分离模式实现。 后端代码编写 目录: 代码…

多线程高并发笔记

一、基础知识 1. 线程打断的三种方法 interrupt() 打断某个线程(其实只是设置一个标志位)isInterrupted() 查询某线程是否被打断过(查询是否设置了标志位)static interrupted() 查询当前线程是否被打断过,并重置打断…

计算机毕业设计ssm+vue基本微信小程序的今日菜谱系统

项目介绍 谈到外出就餐,我们除了怕排队,也怕这家餐厅的服务员不够用,没人为我们点餐,那么一餐饭排队一小时,点餐恐怕也要花个半小时,这样不仅给消费者的用餐体验大打折扣同时也给商家的口碑造成了严重负面的影响,所以开发今日菜谱微信小程序系统是必须也是必然的。 本系统采用微…

vue2 sass 安装及使用

最近在看前端。其一因为手里有个项目uniapp的里面使用了sass,但是有sass报错,其次想自己写个vue2后台,感觉sass写起来科学点。但是……版本这个东西……太费劲了…… vue2-cli集成webpack,使用vue create 项目名后再安装sass相当…

C++程序设计期末考试复习试题及解析 3(自用~)

DDL1.题目及分析1.对象数组的析构顺序2.浅拷贝的隐患delete p 还是 delete[]p ?类似的题,自行查阅3.常数据成员的初始化4.默认构造函数5.cin、cout所属类6.重载7.静态数据成员8.多态8.联编9.内联函数10.引用11.static12.构造Complex类13.静态成员函数14.抽象类15.标…