Axios 响应拦截器与未登录状态的统一处理
目录
- 前言
- 1. 响应拦截器的作用与应用场景
- 1.1 什么是响应拦截器?
- 1.2 响应拦截器的应用场景
- 2. 代码解读:响应拦截器中的未登录处理
- 2.1 原始代码分析
- 3. 完善未登录处理逻辑
- 3.1 未登录状态的用户体验优化
- 3.2 改进后的代码实现
- 4. 实践中的场景
- 4.1 登录态的动态检测
- 4.2 重定向后的场景复现
- 5. 结语
前言
在现代前端开发中,Axios作为主流的HTTP请求库之一,深受开发者青睐。它不仅支持便捷的请求和响应操作,还提供了强大的拦截器机制,可以帮助我们实现统一的错误处理、身份校验、状态码管理等功能。本文将结合代码示例,详细解析如何在响应拦截器中处理未登录状态,并实现功能完善、用户体验友好的跳转逻辑。
1. 响应拦截器的作用与应用场景
1.1 什么是响应拦截器?
响应拦截器是 Axios 提供的一种扩展机制,允许开发者在每次请求响应到达前对数据进行预处理。它主要用于统一管理响应数据的处理逻辑。通过拦截器,可以避免在每个请求的 .then
或 .catch
中重复编写相同的逻辑,从而提升代码的可维护性。
1.2 响应拦截器的应用场景
以下是响应拦截器的一些典型应用场景:
- 状态码统一处理:对后端返回的状态码进行解析,根据业务逻辑分类处理,例如成功、失败或未授权等。
- 全局错误提示:在响应失败时弹出提示信息,让用户感知请求状态。
- 用户登录状态校验:在返回401(未授权)时跳转到登录页面,避免未登录状态下的后续请求。
- 数据格式统一化:根据需求对响应数据进行重组,方便后续的业务逻辑使用。
2. 代码解读:响应拦截器中的未登录处理
2.1 原始代码分析
以下是我们处理响应逻辑的代码片段:
import router from '@/router';// 添加响应拦截器
instance.interceptors.response.use(result => {// 判断业务状态码if (result.data.code === 0) {return result.data;}// 操作失败,弹出错误提示ElMessage.error(result.data.msg ? result.data.msg : '服务异常');// 异步操作状态转换为失败return Promise.reject(result.data);},err => {// 处理未登录状态if (err.response.status === 401) {ElMessage.error('请先登录');router.push('/login');} else {// 处理其他服务异常ElMessage.error('服务异常');}return Promise.reject(err); // 异步状态转为失败}
);
从这段代码中可以看出,我们通过拦截器对请求结果进行了两层处理:
- 正常响应处理:当后端返回的业务状态码为
0
时,直接返回结果,表示操作成功。 - 错误响应处理:根据
HTTP
状态码分类处理,尤其对401
未授权状态进行了跳转和提示。
3. 完善未登录处理逻辑
3.1 未登录状态的用户体验优化
在用户未登录的情况下,直接跳转到登录页面可能会让用户感到突兀。我们可以通过以下优化措施提升用户体验:
- 保留跳转前页面的路径:在跳转到登录页面前记录用户当前的访问路径,待登录成功后引导用户回到之前的页面。
- 统一错误提示文案:通过更加人性化的提示语,引导用户登录。
- 登录会话的有效性检测:定期检查用户的登录状态,提前提醒用户登录信息将过期,避免频繁的跳转操作。
3.2 改进后的代码实现
以下是改进后的代码实现:
import router from '@/router';
import store from '@/store'; // 假设使用 Vuex 管理状态instance.interceptors.response.use(result => {// 成功响应的处理逻辑if (result.data.code === 0) {return result.data;}// 操作失败提示ElMessage.error(result.data.msg || '服务异常');return Promise.reject(result.data);},err => {// 未授权状态处理if (err.response.status === 401) {ElMessage.warning('您的登录状态已失效,请重新登录');// 保存当前路径const currentPath = router.currentRoute.value.fullPath;store.commit('auth/setRedirectPath', currentPath); // 假设在 Vuex 中管理重定向路径// 跳转到登录页面router.push('/login');} else {// 其他错误提示ElMessage.error('服务异常,请稍后再试');}return Promise.reject(err);}
);
4. 实践中的场景
4.1 登录态的动态检测
在实际应用中,用户的登录状态可能在未操作一段时间后失效。因此,除了在请求响应时检测状态码 401
,我们还可以结合前端轮询或心跳机制,主动检测用户的登录态是否有效。例如:
- 在每次用户操作时重新刷新 Token 的有效期。
- 使用 WebSocket 或定时器检测服务器端的登录状态。
4.2 重定向后的场景复现
通过在未登录时记录用户访问的路径,我们可以在登录成功后还原用户的访问场景。具体实现思路为:
- 在 Vuex 或其他状态管理工具中存储用户跳转前的路径。
- 在用户登录成功时,从存储中取出路径并跳转到目标页面。
- 如果没有记录路径,则跳转到首页或其他默认页面。
示例代码:
// 在登录页面处理登录成功后的跳转
const redirectPath = store.state.auth.redirectPath || '/';
router.push(redirectPath);
store.commit('auth/clearRedirectPath'); // 清除记录,防止重复跳转
5. 结语
响应拦截器作为 Axios 的核心功能之一,在前端项目中起到了承上启下的作用。通过对响应数据的统一处理,我们不仅能提升代码的复用性,还能大幅改善用户体验。针对未登录状态的处理,我们从用户体验的角度出发,优化了跳转逻辑并引入了状态记录与场景复现功能,这些改进措施能够让应用更加流畅、智能。
相关文章:

Axios 响应拦截器与未登录状态的统一处理
目录 前言1. 响应拦截器的作用与应用场景1.1 什么是响应拦截器?1.2 响应拦截器的应用场景 2. 代码解读:响应拦截器中的未登录处理2.1 原始代码分析 3. 完善未登录处理逻辑3.1 未登录状态的用户体验优化3.2 改进后的代码实现 4. 实践中的场景4.1 登录态的…...

深度学习每周学习总结J6(ResNeXt-50 算法实战与解析 - 猴痘识别)
🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 | 接辅导、项目定制 目录 0. 总结ResNeXt基本介绍 1. 设置GPU2. 导入数据及处理部分3. 划分数据集4. 模型构建部分5. 设置超参数:定义损失函数&…...
Flask 中的 `url_for` 使用指南
在 Flask 中,url_for 是一个强大的工具,用于动态生成 URL。相比硬编码路径,url_for 更加灵活且便于维护。以下是其常见用法和技巧。 基本用法 url_for 根据 视图函数名称 和 动态参数 生成 URL。例如: from flask import Flask,…...

xiaolin coding 图解网络笔记——HTTP篇
1. HTTP 是什么? HTTP 是超文本传输协议(HyperText Transfer Protocol),一个用在计算机世界里专门在【两点】之间【传输】文字、图片、音频、视频等【超文本】数据的【约定和规范】。 2. HTTP 常见的状态码有哪些? …...
Oracle热备过程中对数据库崩溃的处理方法
引言 在热备过程中如果发生数据库崩溃、断电等情况该如何处理? 如果正在备份 users 表空间的数据文件过程中,此时的数据文件表头 SCN 会被锁定,此时正在复制数据文件时数据库崩溃,系统断电。 从而导致数据文件表头与控制文件中的不一致,导致数据库无法打开,会要求介质恢…...
【phpseclib】 PHP 使用加密算法 RSA、DES、AES等
一、Composer 下载 phpseclib # 我使用的是 phpseclib3 composer require phpseclib/phpseclib二、RSA 加密解密 // 我使用的是 phpseclib3use phpseclib3\Crypt\RSA;$type PKCS8; // 看需求选其一, PKCS8 | PKCS1 | JWK | MSBLOB | OpenSSH | PSS | PuTTY | Raw | WML $rsa…...

【ubuntu】开机进入initramfs,无法开机
Step 1 blkid查看 ext4 的磁盘 Step 2 找到TYPE"EXT4"的盘,我们此处是 /dev/mapper/ubuntu–vg-ubuntu–lv,fsck命令是用于检查和修复Linux文件系统中的错误。通过使用-t参数指定文件系统类型(例如ext4)。我们使用如下命令进行…...

ECLAIR:利用基础模型实现企业自动化
人工智能咨询培训老师叶梓 转载标明出处 尽管流程自动化的概念已经存在了几十年,但实现端到端工作流程自动化的最终愿景仍然难以捉摸。斯坦福大学的研究人员提出了一种新的解决方案——ECLAIR系统,旨在通过最少的人工监督实现企业工作流程的自动化。 EC…...

The Yarn application application_xxx_xxx doesn‘t exist in RM
本文主要解决flink在standalone模式下,flink run却一直使用yarn-session模式的问题。 问题 有个客户找到笔者,问题是报错如下: 分析 笔者先从环境入手,首先要确定的是flink是使用了什么模式。确认过后是使用standalone模式。 那就很奇怪&a…...

elasticsearch介绍和部署
1 elasticsearch介绍 Elasticsearch 是一个分布式、高扩展、高实时的搜索与数据分析引擎。可以很方便的使大量数据具有搜索、分析和探索的能力。充分利用Elasticsearch的水平伸缩性。Elasticsearch 的实现原理主要分为以下几个步骤,首先用户将数据提交到Elasticsea…...
Flutter之使用mqtt进行连接和信息传输的使用案例
目录 引言 什么是MQTT? 在Flutter中使用MQTT 安装 iOS 安卓 创建一个全局的客户端对象 配置客户端对象 连接(异步) 监听接受的消息 发送消息 监听连接状态和订阅的回调 引言 随着移动应用开发技术的发展,实时通信成为…...

汽车HiL测试:利用TS-GNSS模拟器掌握硬件性能的仿真艺术
一、汽车HiL测试的概念 硬件在环(Hardware-in-the-Loop,简称HiL)仿真测试,是模型基于设计(Model-Based Design,简称MBD)验证流程中的一个关键环节。该步骤至关重要,因为它整合了实际…...

【MyBatisPlus·最新教程】包含多个改造案例,常用注解、条件构造器、代码生成、静态工具、类型处理器、分页插件、自动填充字段
文章目录 一、MyBatis-Plus简介二、快速入门1、环境准备2、将mybatis项目改造成mybatis-plus项目(1)引入MybatisPlus依赖,代替MyBatis依赖(2)配置Mapper包扫描路径(3)定义Mapper接口并继承BaseM…...
前端知识点---rest(javascript)
文章目录 前端知识点---rest(javascript)rest的用法基本语法特点使用场景与扩展运算符(spread)区别小练习 前端知识点—rest(javascript) rest出现于ES2015 function doSum(a,b, ...args) //示例中的args就是一个rest参数 //它会将后续的所有参数存储…...

13. 猜最大公约数最小公倍数小游戏
文章目录 概要整体架构流程技术名词解释技术细节小结 1. 概要 ~ Jack Qiao对米粒说:“今天咱们玩个小游戏,这个游戏的玩家需要猜出,两个随机生成的整数的最大公约数(GCD)和最小公倍数(LCM)。如…...
Git 多仓库提交用户信息动态设置
Git 多仓库提交用户信息动态设置 原文地址:dddhl.cn 前言 在日常开发中,我们可能需要同时管理多个远程仓库(如 GitHub、Gitee、GitLab),而每个仓库使用不同的邮箱和用户名。比如,GitHub 和 Gitee 使用相…...

2024.6使用 UMLS 集成的基于 CNN 的文本索引增强医学图像检索
Enhancing Medical Image Retrieval with UMLS-Integrated CNN-Based Text Indexing 问题 医疗图像检索中,图像与相关文本的一致性问题,如患者有病症但影像可能无明显异常,影响图像检索系统准确性。传统的基于文本的医学图像检索࿰…...

了解Redis(第一篇)
目录 Redis基础 什么事Redis Redis为什么这么快 除了 Redis,你还知道其他分布式缓存方案吗? 说-下 Redis 和 Memcached 的区别和共同点 为什么要用Redis? 什么是 Redis Module?有什么用? Redis基础 什么事Redis Redis (REmote DIctionary S…...

UE5 第一人称射击项目学习(二)
在上一章节中。 得到了一个根据视角的位置创建actor的项目。 现在要更近一步,对发射的子弹进行旋转。 不过,现在的子弹是圆球形态的,所以无法分清到底怎么旋转,所以需要把子弹变成不规则图形。 现在点开蓝图。 这里修改一下&…...

npm/cnpm的使用
npm 1、安装npm 前往nodejs官网下载安装node 验证是否安装成功node node -v node安装npm也会安装 npm -v 2、使用npm 1. 初始化项目 在一个项目文件夹中运行: npm init 根据提示输入项目信息(如项目名称、版本号等)。 如果你希望快速初…...

从WWDC看苹果产品发展的规律
WWDC 是苹果公司一年一度面向全球开发者的盛会,其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具,对过去十年 WWDC 主题演讲内容进行了系统化分析,形成了这份…...

AI Agent与Agentic AI:原理、应用、挑战与未来展望
文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例:使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例:使用OpenAI GPT-3进…...
从零实现富文本编辑器#5-编辑器选区模型的状态结构表达
先前我们总结了浏览器选区模型的交互策略,并且实现了基本的选区操作,还调研了自绘选区的实现。那么相对的,我们还需要设计编辑器的选区表达,也可以称为模型选区。编辑器中应用变更时的操作范围,就是以模型选区为基准来…...
在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module
1、为什么要修改 CONNECT 报文? 多租户隔离:自动为接入设备追加租户前缀,后端按 ClientID 拆分队列。零代码鉴权:将入站用户名替换为 OAuth Access-Token,后端 Broker 统一校验。灰度发布:根据 IP/地理位写…...
3403. 从盒子中找出字典序最大的字符串 I
3403. 从盒子中找出字典序最大的字符串 I 题目链接:3403. 从盒子中找出字典序最大的字符串 I 代码如下: class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...

pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)
目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关࿰…...

技术栈RabbitMq的介绍和使用
目录 1. 什么是消息队列?2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...

保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek
文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama(有网络的电脑)2.2.3 安装Ollama(无网络的电脑)2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...

CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)
漏洞概览 漏洞名称:Apache Flink REST API 任意文件读取漏洞CVE编号:CVE-2020-17519CVSS评分:7.5影响版本:Apache Flink 1.11.0、1.11.1、1.11.2修复版本:≥ 1.11.3 或 ≥ 1.12.0漏洞类型:路径遍历&#x…...

【VLNs篇】07:NavRL—在动态环境中学习安全飞行
项目内容论文标题NavRL: 在动态环境中学习安全飞行 (NavRL: Learning Safe Flight in Dynamic Environments)核心问题解决无人机在包含静态和动态障碍物的复杂环境中进行安全、高效自主导航的挑战,克服传统方法和现有强化学习方法的局限性。核心算法基于近端策略优化…...