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

news2024/11/15 12:21:16

在这里插入图片描述
上一节有讲过 【图文并茂】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 nothing
              break;
            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: redirect
              break;
            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.coloradmin.cn/o/2074114.html

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

相关文章

工作实战-项目压测记录

1-1-1每分钟的单量 1-1-2第二版测试 2022年5月16日 17:43:11 成功 失败 其它(nginx) 真实入库单量 总单量 52 1 447 500 2022年5月16日 19:42:18 成功 失败 其它(nginx) 真实入库单量 总单量 311 689 306 1000 2-0-1. 20线程-2000单执行结果 2-1-0. 40线…

金融科技 API 接口:提升金融服务效率的关键

金融科技是应用技术手段和创新理念来提升金融服务效率的重要途径。而其中的API接口则是实现金融科技的关键。API接口的简单定义是提供计算机程序之间通信的规范和工具,提供一种方法和数据的交互形式,以便开发人员能够利用现有的软件来创建新的应用和服务…

前端网格布局display: grid;

display: grid; 块级网格 (常用) display: inline-grid; 行内块级网格 (一般不用) HTML 元素将 display 属性设置为 grid 或 inline-grid 后,它就变成了一个网格容器,这个元素的所有直系子元素将…

Mobile-Agent项目部署与学习总结(DataWhale AI夏令营)

前言 你好,我是GISer Liu,一名热爱AI技术的GIS开发者,本文是DataWhale 2024 AI夏令营的最后一期——Mobile-Agent赛道,这是作者的学习文档,这里总结一下,和作者一起学习这个多模态大模型新项目吧&#x1f6…

开放式耳机对耳朵的伤害会减小吗?亲测好用的四款蓝牙耳机

开放式耳机对耳朵的伤害相对较小。 首先,开放式耳机不入耳,不会直接堵塞耳道,减少了对耳道的挤压和摩擦,降低了因长期佩戴入耳式耳机可能导致的耳道发炎、疼痛等问题。 其次,由于耳朵没有被完全封闭,耳部能…

【C/C++】结构体指针赋值的方法

在C语言中,结构体指针赋值有两种方法: 1.使用"->"操作符:通过结构体指针访问结构体成员并赋值。例如: struct Student {int id;char name[20]; };int main() {struct Student s1;struct Student *ptr_s1 &s1;…

设计模式学习[4]---依赖倒置原则+里氏代换原则

文章目录 前言1. 依赖倒置原则1.1 原理阐述1.2 举例 2.里氏代换原则2.1 原理阐述2.2 举例说明 总结 前言 在给发新功能模块之前,都先要画UML类图进行需求分析。对每一个类的作用,类与类之间的关系做一个详细的阐述。确定好基本的框架之后,才…

Lumos学习王佩丰Excel第十四讲:日期函数

一、认识时间和日期 1、回顾日期格式 日期可以由数字表示。 2、时间格式 时间由小数表示。 3、基本的时间与日期运算 二、日期函数 1、Year、Month、Day函数 2、Date函数 DATE(year,month,day):year为必需参数,可以包含1到4个数字。Day函…

LeetCode 热题 100 回顾

目录 一、哈希部分 1.两数之和 (简单) 2.字母异位词分组 (中等) 3.最长连续序列 (中等) 二、双指针部分 4.移动零 (简单) 5.盛最多水的容器 (中等) 6…

文心一言 VS 讯飞星火 VS chatgpt (332)-- 算法导论23.1 1题

一、设(u,v)是连通图G中的一条权重最小的边,证明:边(u,v)为图G的某棵最小生成树中的一条边。如果要写代码,请用go语言。 文心一言: 为了证明边(u,v)是图G的某棵最小生成树中的一条边,我们可以使用反证法结合最小生成…

09 复合查询

前面的查询都是对一张表进行查询,但这远远不够 基本查询回顾 查询工资高于500或岗位为MANAGER的雇员,同时还要满足他们的姓名首字母为大写的J select * from EMP where (sal>500 or job‘MANAGER’) and ename like ‘J%’; 按照部门号升序而雇员的…

免费用的写作神器:一键自动生成文章,提升内容创作效率!

传统的写作过程往往耗时耗力,从构思、调研到撰写、修改,每一步都需要创作者亲力亲为。免费写作神器的出现,犹如一场及时雨,为创作者提供了强大的支持。它利用先进的算法和自然语言处理技术,能够在短时间内生成高质量的…

了解Redis数据持久化(中)

3.5写时复制 Redis在使用RDB方式进行持久化时,会用到写时复制机制。写时复制的效果: bgsave子进程相当于复制了原始数据,而主线程仍然可以修改原来的数据。 对Redis来说,主线程fork出bgsave子进程后,bgsave子进程实际是复制了主线…

初识C语言指针(5)

目录 1. 回调函数 2. qsort函数 2.1 qsort函数的基本参数 2.2 qsort函数的使用 2.3 qsort排序结构体类型数据 结语 1. 回调函数 什么是回调函数呢?回调函数就是⼀个通过函数指针调⽤的函数。 如果你把函数的指针(地址)作为参数传递给另…

超分CAMixerSR 使用笔记

目录 超分CAMixerSR 笔记 自己改进的图例示例: 修改目录: 设置预训练模型: 超分CAMixerSR 笔记 自己改进的图例示例: 修改目录: codes/basicsr改为codes/basicsr_m 设置预训练模型: path:pretrain_network_g: F:\project\chaofen\CAMixerSR-main\pretrained_mode…

解决html中文乱码问题

在head上面添加 <% page contentType"text/html;charsetUTF-8" language"java" %>

【Three.js基础学习】19.Custom models with Blender

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 前言 blender模型资源:【blender】一个汉堡包-CSDN博客 一、代码 import ./style.css import * as THREE from three import { OrbitControls } from three/examples/jsm/co…

集成mybatis-plus框架

文章目录 1.新建一个sun_frame数据库并创建user表2.新建一个sun-common-mybatisplus模块1.maven项目2.添加依赖 3.sun-user集成mybatis-plus1.配置application.yml2.修改架构&#xff0c;由sun-user模块引入需要的公共模块3.代码目录结构4.mapper&#xff1a;po查&#xff0c;p…

SQLSugar进阶使用:高级查询与性能优化

文章目录 前言一、高级查询1.查所有2.查询总数3.按条件查询4.动态OR查询5.查前几条6.设置新表名7.分页查询8.排序 OrderBy9.联表查询10.动态表达式11.原生 Sql 操作 &#xff0c;Sql和存储过程 二、性能优化1.二级缓存2.批量操作3.异步操作4.分表组件&#xff0c;自动分表5.查询…

了解Redis数据持久化(上)

Redis常用作缓存&#xff0c;提高读取相应性能。Redis如果宕机可以从后端数据库里恢复数据&#xff0c;但是会出现的问题&#xff1a; 数据是从慢速数据库里获取数据&#xff0c;速度比不上从Redis缓存中获取。频繁访问数据库会给数据库造成压力。 处理宕机的方法就是&#xf…