Axios Token 设置示例

以下是一个完整的 Axios Token 设置示例,涵盖全局配置、请求拦截器和单次请求设置三种方式:

1. 基础配置(推荐方案)

javascript复制代码

import axios from 'axios';// 创建 Axios 实例
const apiClient = axios.create({baseURL: 'https://api.yourdomain.com',timeout: 10000,
});// 请求拦截器(自动添加 Token)
apiClient.interceptors.request.use(config => {// 从安全存储获取 token(如 localStorage、Vuex/Pinia、Redux 等)const token = localStorage.getItem('authToken') || sessionStorage.getItem('authToken');if (token) {config.headers.Authorization = `Bearer ${token}`;} else {console.warn('No authentication token found');}return config;
}, error => {return Promise.reject(error);
});export default apiClient;

2. 使用示例

javascript复制代码

// 使用配置好的实例发起请求
apiClient.get('/user/profile').then(response => {console.log('用户数据:', response.data);}).catch(error => {console.error('请求失败:', error.response?.data || error.message);});

3. 单次请求设置 Token

javascript复制代码

// 方法 1:通过 headers 参数
axios.get('/protected/data', {headers: {Authorization: `Bearer ${localStorage.getItem('authToken')}`}
});// 方法 2:使用自定义实例
const tempClient = axios.create();
tempClient.get('/protected/data', {headers: {Authorization: `Bearer ${localStorage.getItem('authToken')}`}
});

4. 完整 Vue.js 应用示例

javascript复制代码

// main.js
import { createApp } from 'vue';
import axios from 'axios';
import App from './App.vue';const app = createApp(App);// 全局配置 Axios
const apiClient = axios.create({baseURL: import.meta.env.VITE_API_URL,
});apiClient.interceptors.request.use(config => {const token = localStorage.getItem('authToken');token && (config.headers.Authorization = `Bearer ${token}`);return config;
});// 挂载到全局属性
app.config.globalProperties.$axios = apiClient;app.mount('#app');

javascript复制代码

// AuthService.js
export default {async login(credentials) {const response = await axios.post('/auth/login', credentials);// 保存 token 到 localStoragelocalStorage.setItem('authToken', response.data.token);return response.data.user;},logout() {localStorage.removeItem('authToken');},async getUserData() {// 使用全局配置的 axios 实例return this.$axios.get('/user');}
}

5. 处理 Token 过期的响应拦截器

javascript复制代码

// 添加响应拦截器
apiClient.interceptors.response.use(response => response,error => {const originalRequest = error.config;// 检测 401 错误且未重试过if (error.response.status === 401 && !originalRequest._retry) {originalRequest._retry = true;// 使用刷新 token 获取新 access tokenreturn axios.post('/auth/refresh-token', {refreshToken: localStorage.getItem('refreshToken')}).then(res => {// 保存新 tokenlocalStorage.setItem('authToken', res.data.accessToken);// 更新请求头originalRequest.headers.Authorization = `Bearer ${res.data.accessToken}`;// 重新发起原始请求return axios(originalRequest);}).catch(refreshError => {// 刷新失败则登出store.dispatch('logout');return Promise.reject(refreshError);});}return Promise.reject(error);}
);

6. 安全实践建议

  1. 存储位置

    javascript复制代码

    // 避免 XSS 攻击的最佳实践
    const secureStorage = {set: (key, value) => {if (window.isSecureContext) {// 优先使用 HttpOnly cookies(服务端设置)} else {// 次选方案:sessionStorage(标签页生命周期)sessionStorage.setItem(key, value);}},get: (key) => sessionStorage.getItem(key)
    }
    
  2. Token 自动续期

    javascript复制代码

    // 定时检查 token 有效期
    setInterval(() => {const token = localStorage.getItem('authToken');if (token && isTokenExpiringSoon(token)) {refreshTokenSilently();}
    }, 300000); // 每 5 分钟检查一次
    
  3. 敏感操作保护

    javascript复制代码

    // 关键操作前验证密码
    async function changePassword(newPassword) {const password = prompt('请确认您的密码');await apiClient.post('/verify-password', { password });return apiClient.put('/user/password', { newPassword });
    }
    

7. 完整流程图

mermaid复制代码导出svg

8. 常见错误处理

javascript复制代码

// 统一错误处理
apiClient.interceptors.response.use(response => response,error => {if (error.response) {switch (error.response.status) {case 401:console.error('认证失败,请重新登录');router.push('/login');break;case 403:console.error('权限不足,无法访问');break;case 429:console.warn('请求过于频繁,请稍后重试');break;default:console.error(`请求错误: ${error.message}`);}} else if (error.request) {console.error('服务器无响应', error.request);} else {console.error('请求配置错误', error.message);}return Promise.reject(error);}
);

以上实现满足企业级应用的安全要求,可根据实际框架(React/Vue/Angular)进行调整。关键要点:

  1. 使用 Axios 实例封装避免全局污染
  2. 拦截器自动处理 Token 注入
  3. 实现 Token 刷新机制
  4. 提供多种存储方案的安全实践
  5. 完整的错误处理流程

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

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

相关文章

Excel数据合并工具:零门槛快速整理

软件介绍 在数据处理工作中,合并Excel同类数据是一项常见但繁琐的任务。今天为大家推荐一款专为简化此类操作设计的工具,它能快速完成工作表内多行同类数据的合并整理,大幅提升数据处理效率。 零门槛操作体验 相比Excel自带的数据透视…

深度学习 -- 梯度计算及上下文控制

深度学习 – 梯度计算及上下文控制 文章目录深度学习 -- 梯度计算及上下文控制一,自动微分1.1 基础概念1.2 计算梯度1.2.1 计算标量梯度1.2.2 计算向量梯度1.2.3 多标量梯度计算1.2.4 多向量梯度计算二,梯度上下文控制2.1 控制梯度计算2.2 累计梯度2.3 梯…

Redisson RLocalCachedMap 核心参数详解

🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编…

【Unity3D实例-功能-移动】角色移动-通过WSAD(Rigidbody方式)

你是否曾梦想在虚拟世界中自由翱翔,像海豚一样在海洋自由穿梭,或者像宇航员一样在宇宙中尽情探索?今天,我们就来聊聊如何在Unity中使用Rigidbody来实现角色移动。 废话不多说,走,让我们马上来一探究竟&…

Vue接口平台学习十一——业务流测试

效果图及简单说明 与之前的用例列表相似布局,也分左右,左边用于显示测试流程的名称,右边用于显示流程相关信息。 左侧点击添加,直接增加一个新的业务流。 右侧是点击的业务流详情,展示名称,名称的编辑保存&…

碳化硅缺陷分类与原因

01一、碳化硅晶体材料中的缺陷到底是什么?碳化硅晶体材料中的缺陷是指在晶体生长、加工或使用过程中出现的不完美结构。这些缺陷可能表现为晶体内部的裂纹、表面的凹坑、原子排列的错误等。虽然缺陷看起来微不足道,但它们却可能对晶体的电学、热学和机械…

Jenkins 实现项目的构建和发布

作者:小凯 沉淀、分享、成长,让自己和他人都能有所收获! 本文的宗旨在于通过简单干净实践的方式教会读者,如何在 Docker 中部署 Jenkins,并通过 Jenkins 完成对项目的打包构建并在 Docker 容器中部署。 Jenkins 的主要…

Django接口自动化平台实现(三)

3.2 后台 admin 添加数据 1)注册模型类到 admin: 1 from django.contrib import admin2 from . import models3 4 5 class ProjectAdmin(admin.ModelAdmin):6 list_display ("id", "name", "proj_owner", "tes…

CentOS 7 配置环境变量常见的4种方式

✨博客主页: https://blog.csdn.net/m0_63815035?typeblog 💗《博客内容》:.NET、Java.测试开发、Python、Android、Go、Node、Android前端小程序等相关领域知识 📢博客专栏: https://blog.csdn.net/m0_63815035/cat…

k8s:手动创建PV,解决postgis数据库本地永久存储

1.离线环境CPU:Hygon C86 7285 32-core Processor 操作系统:麒麟操作系统 containerd:1.7.27 Kubernetes:1.26.12 KubeSphere:4.1.2 kubekey:3.1.10 Harbor:2.13.1 Postgis:17-3.52创建StorageClass2.1创建 apiVersion: storage.k8s.io/v1kin…

谷歌浏览器Chrome的多用户配置文件功能

谷歌浏览器Chrome的多用户配置文件功能允许在同一设备上创建多个独立账户,每个账户拥有完全隔离的浏览数据(如书签、历史记录、扩展、Cookies等),非常适合工作/生活账户分离、家庭共享或临时多账号登录场景。 如何使用Chrome的多用户配置文件功能? 一、创建与切换用户 1.…

傲软录屏 专业高清录屏软件 ApowerREC Pro 下载与保姆级安装教程!!

小编今天分享一款强大的电脑屏幕录像软件 傲软录屏 ApowerREC,能够帮助用户录制中电脑桌面屏幕上的所有内容,包括画面和声音,支持全屏录制、区域录制、画中画以及摄像头录制等多种视频录制模式,此外,还支持计划任务录制…

【计算机网络】MAC地址与IP地址:网络通信的双重身份标识

在计算机网络领域,MAC地址与IP地址是两个核心概念,它们共同构成了数据传输的基础。理解二者的区别与联系,对于网络配置、故障排查及安全管理至关重要。 一、基本概念 1. MAC地址(物理地址) 定义:固化在网络…

如何用keepAlive实现标签页缓存

什么是KeepAlive首先,要明确所说的是TCP的 KeepAlive 还是HTTP的 Keep-Alive。TCP的KeepAlive和HTTP的Keep-Alive是完全不同的概念,不能混为一谈。实际上HTTP的KeepAlive写法是Keep-Alive,跟TCP的KeepAlive写法上也有不同。TCP的KeepAliveTCP…

数据库隔离级别

隔离级别决定了事务之间的可见性规则,直接影响数据库的并发性能和数据一致性。SQL 标准定义了 4 种隔离级别,从低到高依次为:读未提交→读已提交→可重复读→串行化。隔离级别越高,对并发问题的解决能力越强,但对性能的…

基于Python flask的电影数据分析及可视化系统的设计与实现,可视化内容很丰富

摘要:基于Python的电影数据分析及可视化系统是一个应用于电影市场的数据分析平台,旨在为广大电影爱好者提供更准确、更详细、更实用的电影数据。数据分析部分主要是对来自猫眼电影网站上的数据进行清洗、分类处理、存储等步骤,数据可视化则是…

TCP通讯开发注意事项及常见问题解析

文章目录一、TCP协议特性与开发挑战二、粘包与拆包问题深度解析1. 成因原理2. 典型场景与实例验证3. 系统化解决方案接收方每次读取10字节2. 丢包检测与验证工具3. 工程化解决方案四、连接管理关键实践1. 超时机制设计2. TIME_WAIT状态优化3. 异常处理最佳实践五、高性能TCP开发…

2021 RoboCom 世界机器人开发者大赛-本科组(复赛)解题报告 | 珂学家

前言 题解 睿抗机器人开发者大赛CAIP-编程技能赛-历年真题 汇总 2021 RoboCom 世界机器人开发者大赛-本科组(复赛)解题报告 感觉这个T1特别有意思,非典型题,着重推演下结论。 T2是一道玄学题,但是涉及一些优化技巧…

《计算机“十万个为什么”》之 MQ

《计算机“十万个为什么”》之 MQ 📨 欢迎来到消息队列的奇妙世界! 在这篇文章中,我们将探索 MQ 的奥秘,从基础概念到实际应用,让你彻底搞懂这个分布式系统中不可或缺的重要组件!🚀 作者&#x…

Django母婴商城项目实践(七)- 首页数据业务视图

7、首页数据业务视图 1、介绍 视图(View)是Django的MTV架构模式的V部分,主要负责处理用户请求和生成相应的响应内容,然后在页面或其他类型文档中显示。 也可以理解为视图是MVC架构里面的C部分(控制器),主要处理功能和业务上的逻辑。我们习惯使用视图函数处理HTTP请求,…