当前位置: 首页 > news >正文

ts 联合react 实现ajax的封装,refreshtoken的功能

react ts混合双打,实现ajax的封装,以及401的特殊处理

import axios from 'axios'
import {AMDIN_EXPIRES_KEY,AMDIN_KEY,AMDIN_REFRESH_EXPIRES_KEY,AMDIN_REFRESH_KEY,COMMID_KEY,getToken,removeToken
} from '../utils/user-token'
import { showMessage } from '../utils/feedback'
import { fetchGetRefreshInfo } from './user'
import { setUserToken } from '../utils/public'
import router from '../router'// 失败的fetch 集合
let isRefreshing = false
let failedQueue: any[] = []// 创建一个axios实例
const instance = axios.create()// 添加请求拦截器
instance.interceptors.request.use((config: any) => {// 在发送请求之前做些什么const token = getToken(AMDIN_KEY)// if (token) {// config.headers.Authorization = `Bearer ${token}` // 将token设置到请求头中config.headers = {Authorization: `Bearer ${token}`,...config.headers}// }return config},(error) => {// 对请求错误做些什么return Promise.reject(error)}
)// 添加响应拦截器
instance.interceptors.response.use(async (res) => {const resData = (res.data || {}) as ResType// console.log('response - resData: ', resData)const { code, msg = '系统正在升级,稍后再试' } = resDataif ((code) === 200) {return Promise.resolve(resData as any)} else {await showMessage(msg).then(() => {return Promise.reject(resData)})}},async (error) => {// 对响应错误做点什么// if (error.response && error.response.status === 401) {//   // 判断是否为401//   const refreshToken = getToken(AMDIN_REFRESH_KEY)//   if (refreshToken) {//     try {//       // 使用refreshToken请求新的token//       const res = await fetchGetRefreshInfo()//       // 将新的token保存到localStorage//       setUserToken(res.Data.token)//       // 用新的token重新发送失败的请求//       const config = error.config//       config.headers.Authorization = `Bearer ${getToken(AMDIN_KEY)}`//       return instance(config)//     } catch (err) {//       console.error('刷新token失败', err)//       // 刷新token失败,跳转到登录页等处理//       router.navigate(`/login?commId=${getToken(COMMID_KEY)}`, {//         replace: true//       })//     }//   }// }if (error.response && error.response.status === 401) {// 特殊处理 当RefreshToken 的接口401时候,及RefreshToken token的也过期了// 如果不处理,将会死循环if (error.response.config.url.indexOf('RefreshToken') > -1) {// 刷新token失败,跳转到登录页等处理removeToken(AMDIN_KEY)removeToken(AMDIN_EXPIRES_KEY)removeToken(AMDIN_REFRESH_EXPIRES_KEY)removeToken(AMDIN_REFRESH_KEY)router.navigate(`/login?commId=${getToken(COMMID_KEY)}`, {replace: true})return}const originalRequest = error.configif (!isRefreshing) {isRefreshing = trueawait fetchGetRefreshInfo().then((res) => {// 将新的token保存到localStoragesetUserToken(res.Data.token)isRefreshing = falseconst newToken = getToken(AMDIN_KEY)processQueue(null, newToken)originalRequest.headers['Authorization'] = 'Bearer ' + newTokenreturn instance(originalRequest)}).catch((err) => {processQueue(err, null)return Promise.reject(err)})} else {return new Promise(function (resolve, reject) {failedQueue.push({ resolve, reject })}).then((token) => {originalRequest.headers['Authorization'] = 'Bearer ' + tokenreturn instance(originalRequest)}).catch((err) => {return Promise.reject(err)})}}return Promise.reject(error)}
)const processQueue = (error: any, token: string | null = null) => {failedQueue.forEach((prom) => {if (error) {prom.reject(error)} else {prom.resolve(token)}})failedQueue = []
}export default instanceexport type ResType = {code?: numberdata?: ResDataTypemsg?: string
}export type ResDataType = {[key: string]: any
}
  • service.ts
// 刷新token
export async function fetchGetRefreshInfo(): Promise<ResDataType> {const url = `${REACT_APP_URL}/XXXXXXXXXXXXXXXXX/RefreshToken`return axios({url,method: 'post',headers: {Authorization: `Bearer ${refreshToken}`}})
}

相关文章:

ts 联合react 实现ajax的封装,refreshtoken的功能

react ts混合双打&#xff0c;实现ajax的封装&#xff0c;以及401的特殊处理 import axios from axios import {AMDIN_EXPIRES_KEY,AMDIN_KEY,AMDIN_REFRESH_EXPIRES_KEY,AMDIN_REFRESH_KEY,COMMID_KEY,getToken,removeToken } from ../utils/user-token import { showMessage…...

CISP模拟试题(一)

免责声明 文章仅做经验分享用途,利用本文章所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,作者不为此承担任何责任,一旦造成后果请自行承担!!! 1.下面关于信息安全保障的说法错误的是:C A.信息安全保障的概念是与信息安全的概念同时产生的 …...

轻量封装WebGPU渲染系统示例<35>- HDR环境数据应用到PBR渲染材质

当前示例源码github地址: https://github.com/vilyLei/voxwebgpu/blob/feature/rendering/src/voxgpu/sample/BasePbrMaterialTest.ts 当前示例运行效果: 微调参数之后的效果: 此示例基于此渲染系统实现&#xff0c;当前示例TypeScript源码如下: export class BasePbrMateri…...

春秋云境靶场CVE-2022-28512漏洞复现(sql手工注入)

文章目录 前言一、CVE-2022-28512靶场简述二、找注入点三、CVE-2022-28512漏洞复现1、判断注入点2、爆显位个数3、爆显位位置4 、爆数据库名5、爆数据库表名6、爆数据库列名7、爆数据库数据 总结 前言 此文章只用于学习和反思巩固sql注入知识&#xff0c;禁止用于做非法攻击。…...

数字化文化的守护之星:十八数藏的非遗创新之道

在数字时代的浪潮中&#xff0c;十八数藏犹如一颗璀璨的守护之星&#xff0c;为传统文化注入了新的生命力。这个非遗创新项目以数字化为工具&#xff0c;以守护为使命&#xff0c;开辟了文化传承的新航道。 十八数藏是文化数字守护的引领者&#xff0c;通过数字技术&#xff0…...

[机缘参悟-119] :反者道之动与阴阳太极

目录 一、阴阳对立、二元对立的规律 1.1 二元对立 1.2 矛盾的对立与统一 二、阴阳互转、阴阳变化、变化无常 》无序变化和有序趋势的规律 三、阴阳合一、佛魔一体、善恶同源 四、看到积极的一面 五、反者道之动 5.1 概述 5.2 "否极泰来" 5.3 “乐极生悲”…...

Docker搭建Redis集群

Docker搭建Redis集群 创建一个专属redis的网络 docker network create redis --subnet 172.38.0.0/16通过shell脚本创建并启动6个redis服务 #通过脚本一次创建6个redis配置 for port in $(seq 1 6); \ do \ mkdir -p /mydata/redis/node-${port}/conf touch /mydata/redis/n…...

学习Opencv(蝴蝶书/C++)代码——2.OpenCV初探

文章目录 0. 图像读取与显示1. 视频文件读取与操作1.1 示例代码1.1 OpenCV支持的视频格式2. 加入滑动条2.1 示例代码2.2 报错/Warning2.3 关于toolbar3. 简易视频播放器3.1 OpenCV检测方向键被按下3.1.1 Windows下3.1.2 linux下3.1 方向键控制视频变化4. 简单的变换5. 写视频5.…...

基于AVR单片机的便携式心电监测设备设计与实现

基于AVR单片机的便携式心电监测设备是一种常用的医疗设备&#xff0c;用于随时监测和记录人体的心电信号。本文将介绍便携式心电监测设备的设计原理和实现步骤&#xff0c;并提供相应的代码示例。 1. 设计概述 便携式心电监测设备是一种小巧、方便携带的设备&#xff0c;能够…...

微机原理_14

一、单项选择题(本大题共15小题,每小题3分,共45分。在每小题给出的四个备选项中,选出一个正确的答案。&#xff09; 1,下面寻址方式的操作数不在存储器中的是(&#xff09; A. 堆栈寻址 B. 寄存器间址 C.寄存器寻址 D. 直接寻址 2,条件转移指令JNE的条件是(&#xff09; A. CF…...

【Flink】核心概念:并行度与算子链

并行度&#xff08;Parallelism&#xff09; 当要处理的数据量非常大时&#xff0c;我们可以把一个算子操作&#xff0c;“复制”多份到多个节点&#xff0c;数据来了之后就可以到其中任意一个执行。这样一来&#xff0c;一个算子任务就被拆分成了多个并行的“子任务”&#x…...

milvus采坑一:启动服务就会挂掉

原因一 硬盘满了&#xff0c;Eric数据文件存储在硬盘上&#xff0c;当硬盘不足&#xff0c;它就会启动后就挂掉。 此时pymilvus连接一直是timeout。 解决方法&#xff1a;更换存储路径。...

WPF Visual, UIElement, FrameworkElement, Control这些类的区别

在WPF (Windows Presentation Foundation) 中&#xff0c;Visual, UIElement, FrameworkElement, 和 Control 这些类是一个类层次结构&#xff0c;它们分别在 WPF 的 UI 元素和控件模型中提供了不同级别的功能。下面是这些类的详细介绍&#xff1a; Visual&#xff1a;这是所有…...

Python-----PyInstaller的简单使用

PyInstaller简介 PyInstaller是一个Python库&#xff0c;可以将Python应用程序转换为独立的可执行文件。PyInstaller支持跨平台&#xff0c;可以在Windows、Linux和MacOS上生成可执行文件。 PyInstaller会分析Python程序&#xff0c;并将程序打包成一个完整的可执行文件&…...

8 Redis与Lua

LUA脚本语言是C开发的&#xff0c;类似存储过程,是为了实现完整的原子性操作&#xff0c;可以用来补充redis弱事务的缺点. 1、LUA脚本的好处 2、Lua脚本限流实战 支持分布式 import org.springframework.core.io.ClassPathResource; import org.springframework.data.redis…...

10个令人惊叹的Go语言技巧,让你的代码更加优雅

关注公众号【爱发白日梦的后端】分享技术干货、读书笔记、开源项目、实战经验、高效开发工具等&#xff0c;您的关注将是我的更新动力&#xff01; 在开发生产项目的过程中&#xff0c;我注意到经常会发现自己在重复编写代码&#xff0c;使用某些技巧时没有意识到&#xff0c;直…...

vue3 setup展示数据

效果图 1.创建数据 content.js import { reactive } from vueconst data reactive({color:red,title: 二十四节气,subTitle: 节气&#xff0c;是干支历中表示自然节律变化以及确立“十二月建”&#xff08;月令&#xff09;的特定节令。,list: [{name: "立春",con…...

原理Redis-Dict字典

Dict 1) Dict组成2) Dict的扩容3) Dict的收缩4) Dict的rehash5) 总结 1) Dict组成 Redis是一个键值型&#xff08;Key-Value Pair&#xff09;的数据库&#xff0c;可以根据键实现快速的增删改查。而键与值的映射关系正是通过Dict来实现的。 Dict由三部分组成&#xff0c;分别…...

卷积神经网络(VGG-19)灵笼人物识别

文章目录 前期工作1. 设置GPU&#xff08;如果使用的是CPU可以忽略这步&#xff09;我的环境&#xff1a; 2. 导入数据3. 查看数据 二、数据预处理1. 加载数据2. 可视化数据3. 再次检查数据4. 配置数据集5. 归一化 三、构建VGG-19网络1. 官方模型&#xff08;已打包好&#xff…...

MQTT协议详解

前言 MQTT是一个即时通讯协议&#xff0c;它工作在TCP/IP协议族上&#xff0c;是为硬件性能低下的远程设备以及网络状况糟糕的情况下而设计的发布/订阅型消息协议。它使用发布/订阅消息模式&#xff0c;提供一对多的消息发布&#xff0c;解除应用程序耦合。MQTT是轻量、简单、…...

基于LLM的LSP服务器llm-ls:为IDE注入AI代码补全能力

1. 项目概述&#xff1a;一个为IDE注入AI灵魂的LSP服务器 如果你和我一样&#xff0c;每天都在和代码编辑器打交道&#xff0c;从Vim到VSCode&#xff0c;从IntelliJ到Jupyter&#xff0c;那你一定对LSP&#xff08;Language Server Protocol&#xff09;不陌生。它让我们的编辑…...

番茄小说下载器完整教程:如何轻松保存全网小说到本地

番茄小说下载器完整教程&#xff1a;如何轻松保存全网小说到本地 【免费下载链接】fanqienovel-downloader 下载番茄小说 项目地址: https://gitcode.com/gh_mirrors/fa/fanqienovel-downloader 想要永久保存番茄小说平台上的精彩作品吗&#xff1f;这款免费开源的番茄小…...

开源AI智能体记忆服务:构建持久化共享记忆中枢

1. 项目概述&#xff1a;为AI智能体构建持久化共享记忆中枢 如果你正在构建或使用基于LangGraph、CrewAI、AutoGen这类框架的多智能体系统&#xff0c;或者你厌倦了每次与Claude、Cursor等AI助手开启新会话时都要重复解释项目背景&#xff0c;那么你很可能正面临一个核心痛点&…...

ComfyUI-Manager终极指南:快速优化AI工作流性能的完整方案

ComfyUI-Manager终极指南&#xff1a;快速优化AI工作流性能的完整方案 【免费下载链接】ComfyUI-Manager ComfyUI-Manager is an extension designed to enhance the usability of ComfyUI. It offers management functions to install, remove, disable, and enable various c…...

Cursor AI 编辑器一键配置指南:从零搭建高效编程工作站

1. 项目概述&#xff1a;一个为 Cursor 编辑器量身定制的“开箱即用”向导如果你是一名开发者&#xff0c;最近肯定没少听人提起 Cursor 这款编辑器。它基于 VS Code&#xff0c;但深度集成了 AI 能力&#xff0c;号称能理解你的代码上下文&#xff0c;帮你写代码、改 Bug、甚至…...

5G有线网络标准化:从管道到智能融合基础设施的演进

1. 从“无线狂欢”到“有线觉醒”&#xff1a;5G标准化的另一面 如果你在2015年前后关注通信行业&#xff0c;印象最深刻的恐怕是各种关于5G的“炫技”新闻&#xff1a;毫米波、Massive MIMO、每秒数十Gb的峰值速率……整个行业仿佛陷入了一场关于“无线空口技术”的军备竞赛。…...

3分钟极速指南:网易云音乐无损FLAC批量下载神器

3分钟极速指南&#xff1a;网易云音乐无损FLAC批量下载神器 【免费下载链接】NeteaseCloudMusicFlac 根据网易云音乐的歌单, 下载flac无损音乐到本地.。 项目地址: https://gitcode.com/gh_mirrors/nete/NeteaseCloudMusicFlac 还在为寻找高品质音乐资源而烦恼吗&#x…...

HarmonyOS 6.0 跨端页面构建实践:从 UI 代码到热力交互卡片设计

HarmonyOS 6.0 跨端页面构建实践&#xff1a;从 UI 代码到热力交互卡片设计 前言 在 HarmonyOS 6.0 的跨端开发体系中&#xff0c;页面构建的核心目标已经从“能运行”逐步转向“高一致性体验 低成本跨端复用”。尤其是在多设备协同的场景下&#xff0c;一个 UI 组件不仅要适配…...

从混淆矩阵到mIOU:手把手解析语义分割核心评价指标

1. 从像素战场到成绩单&#xff1a;理解混淆矩阵 第一次接触语义分割任务时&#xff0c;我盯着那些五彩斑斓的分割图直发懵——怎么判断这个模型到底好不好&#xff1f;直到导师扔给我一张"混淆矩阵"的表格&#xff0c;才恍然大悟这就像学生时代的考试成绩单。想象你…...

2026年奖杯批发源头厂商实力复盘,长沙嘉誉天成工艺品有限公司为何成为行业标杆企业

在各类表彰活动、赛事庆典中&#xff0c;奖杯作为荣誉象征&#xff0c;承载着组织者对获奖者的认可与激励。无论是企业年会的公司奖杯&#xff0c;还是体育赛事的冠军奖杯&#xff0c;其品质直接影响活动效果与品牌形象。作为深耕行业近二十年的专业服务商&#xff0c;长沙嘉誉…...