【图文并茂】ant design pro 如何给后端发送 json web token - 请求拦截器的使用

embedded/2024/9/24 21:22:46/

在这里插入图片描述
上一节有讲过 【图文并茂】ant design pro 如何对接后端个人信息接口

还差一个东西,去获取个人信息的时候,是要发送 token 的,不然会报 403.

就是说在你登录之后才去获得个人信息。这样后端才能知道是谁的信息。

token 就代码了某个人。

登录的问题我们也处理好了:【图文并茂】ant design pro 如何对接登录接口

请求拦截器

src/app.tsx

这里最下面有这样的代码:

export const request = {baseURL: `${process.env.UMI_APP_API_URL}/api`,...errorConfig,
};

errorConfig 你点进去之后,就会跳到另个文件

src/requestErrorConfig.ts

你找到 requestInterceptors 这个地方。

这里就是请求拦截器。

意思是这样的,我们登录之后,进到后台,所有的请求我们都要带上 token ,首先这些后台操作不是公开的,第二,这些操作要登录之后才能操作对吧。

怎么证明你登录过呀,就用 token 呀。

在这里插入图片描述
所以这里用 请求拦截器 把所有的请求都带上 token。

这样没必要每个请求都去写带上 token 的代码,多累呀。

怎么做呢?

很简单

  // 请求拦截器requestInterceptors: [async (config: RequestOptions) => {// 拦截请求配置,进行个性化处理。const url = config?.url;const accessToken = localStorage.getItem('token');return {...config,headers: accessToken ? { Authorization: `Bearer ${accessToken}` } : {},url,};},],

localStorage 去拿到 token 就行。如果你不是存 localStorage 呢,就去别的地方拿,比如 sessionStorage 或 cookies 都可以。反正这些数据登录后都手动存到浏览器持久化的。

完整代码是这样的:

import type { RequestOptions } from '@@/plugin-request/request';
import type { RequestConfig } from '@umijs/max';
import { message, notification } from 'antd';// 错误处理方案: 错误类型
enum ErrorShowType {SILENT = 0,WARN_MESSAGE = 1,ERROR_MESSAGE = 2,NOTIFICATION = 3,REDIRECT = 9,
}
// 与后端约定的响应数据格式
interface ResponseStructure {success: boolean;data: any;errorCode?: number;errorMessage?: string;showType?: ErrorShowType;
}/*** @name 错误处理* pro 自带的错误处理, 可以在这里做自己的改动* @doc https://umijs.org/docs/max/request#配置*/
export const errorConfig: RequestConfig = {// 错误处理: umi@3 的错误处理方案。errorConfig: {// 错误抛出errorThrower: (res) => {const { success, data, errorCode, errorMessage, showType } =res as unknown as ResponseStructure;if (!success) {const error: any = new Error(errorMessage);error.name = 'BizError';error.info = { errorCode, errorMessage, showType, data };throw error; // 抛出自制的错误}},// 错误接收及处理errorHandler: (error: any, opts: any) => {if (opts?.skipErrorHandler) throw error;// 我们的 errorThrower 抛出的错误。if (error.name === 'BizError') {const errorInfo: ResponseStructure | undefined = error.info;if (errorInfo) {const { errorMessage, errorCode } = errorInfo;switch (errorInfo.showType) {case ErrorShowType.SILENT:// do nothingbreak;case ErrorShowType.WARN_MESSAGE:message.warning(errorMessage);break;case ErrorShowType.ERROR_MESSAGE:message.error(errorMessage);break;case ErrorShowType.NOTIFICATION:notification.open({description: errorMessage,message: errorCode,});break;case ErrorShowType.REDIRECT:// TODO: redirectbreak;default:message.error(errorMessage);}}} else if (error.response) {// Axios 的错误// 请求成功发出且服务器也响应了状态码,但状态代码超出了 2xx 的范围message.error(`Response status:${error.response.status}`);} else if (error.request) {// 请求已经成功发起,但没有收到响应// \`error.request\` 在浏览器中是 XMLHttpRequest 的实例,// 而在node.js中是 http.ClientRequest 的实例message.error('None response! Please retry.');} else {// 发送请求时出了点问题message.error('Request error, please retry.');}},},// 请求拦截器requestInterceptors: [async (config: RequestOptions) => {// 拦截请求配置,进行个性化处理。const url = config?.url;const accessToken = localStorage.getItem('token');return {...config,headers: accessToken ? { Authorization: `Bearer ${accessToken}` } : {},url,};},],// 响应拦截器responseInterceptors: [(response) => {// 拦截响应数据,进行个性化处理const { data } = response as unknown as ResponseStructure;if (data?.success === false) {message.error('请求失败!');}return response;},],
};
  • ant design pro 如何去保存颜色
  • ant design pro v6 如何做好角色管理
  • ant design 的 tree 如何作为角色中的权限选择之一
  • ant design 的 tree 如何作为角色中的权限选择之二
  • ant design pro access.ts 是如何控制多角色的权限的
  • ant design pro 中用户的表单如何控制多个角色
  • ant design pro 如何实现动态菜单带上 icon 的
  • ant design pro 的表分层级如何处理
  • ant design pro 如何处理权限管理
  • ant design pro 技巧之自制复制到剪贴板组件
  • ant design pro 技巧之实现列表页多标签
  • 【图文并茂】ant design pro 如何对接登录接口
  • 【图文并茂】ant design pro 如何对接后端个人信息接口

http://www.ppmy.cn/embedded/100827.html

相关文章

ThreeJs学习-层级模型

ThreeJs所有的模型就是一个树结构 Group层级模型 //创建两个网格模型mesh1、mesh2 const geometry new THREE.BoxGeometry(20, 20, 20); const material new THREE.MeshLambertMaterial({color: 0x00ffff}); const group new THREE.Group(); const mesh1 new THREE.Mesh(ge…

Spring Boot 集成 JdbcTemplate(盘它!)

文章目录 Spring Boot 集成 JdbcTemplate基本介绍JdbcTemplate 概念JdbcTemplate 优势JdbcTemplate 应用场景NamedParameterJdbcTemplate 概念 准备工作项目环境配置Spring Boot版本选择Maven 依赖配置 数据库配置实体类与数据库表映射创建实体类数据库表的设计与创建 JdbcTemp…

分布式互斥锁优化数据库压力:从基础到高级优化

分布式互斥锁优化数据库压力:从基础到高级优化 在高并发系统中,缓存击穿是一个棘手的问题。为了防止多个请求同时穿透缓存访问数据库,分布式锁成为一种有效的解决方案。然而,随着系统复杂度和并发量的增加,简单的锁机…

每日Attention学习15——Cross-Model Grafting Module

模块出处 [CVPR 22] [link] [code] Pyramid Grafting Network for One-Stage High Resolution Saliency Detection 模块名称 Cross-Model Grafting Module (CMGM) 模块作用 Transformer与CNN之间的特征融合 模块结构 模块思想 Transformer在全局特征上更优,CNN在…

【jvm】栈是否存在垃圾回收

目录 一、栈的特点1.1 栈内存分配1.2 栈的生命周期1.3 垃圾回收不直接涉及 二、堆与栈的区别三、总结 一、栈的特点 1.1 栈内存分配 1.栈内存分配是自动的,不需要程序员手动分配和释放。 2.每当一个方法被调用时,JVM就会在这个线程的栈上创建一个新的栈…

设计模式六大原则中的里氏替换原则

设计模式六大原则中的里氏替换原则(Liskov Substitution Principle, LSP)是面向对象设计中一个至关重要的原则,它定义了继承的基本原则和约束,确保子类能够透明地替换父类,而不会破坏系统的正确性和稳定性。以下是对里…

Python类与对象篇(七)

python 面向对象编程类与对象类的属性与方法构造函数与析构函数继承与多态封装与私有属性 面向对象编程 Python 的面向对象编程(Object-Oriented Programming, OOP)是一种编程风格,它将数据(属性)和功能(方法)封装在称为类(class)的结构中。这样做的主要目的是为了提高代码的可…

RongCallKit iOS 端本地私有 pod 方案

RongCallKit iOS 端本地私有 pod 方案 需求背景 适用于源码集成 CallKit 时,使用 pod 管理 RTC framework 以及源码。集成 CallKit 时,需要定制化修改 CallKit 的样式以及部分 UI 功能。适用于 CallKit 源码 Debug 调试便于定位相关问题。 解决方案 从…