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

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.lryc.cn/news/595733.html

相关文章:

  • OEC 刷机Armbain 25.05后配置说明
  • Java 网络编程详解:从基础到实战,彻底掌握 TCP/UDP、Socket、HTTP 网络通信
  • ClearML库详解:从实验跟踪到模型部署的全流程管理
  • 网宿安全发布《2024年度网络安全态势报告》:AI驱动攻防升维,体系化主动安全成破局关键
  • ADA4522-2ARMZ-R7 ADI亚德诺 双通道零漂移运算放大器 工业高精度测试设备应用
  • WAF 防护与漏洞扫描联动:让安全防御更精准高效
  • Linux——进程间通信,匿名管道,进程池
  • 网络初级安全第三次作业
  • C++引用折叠
  • PHP与Web页面交互:从基础表单到AJAX实战
  • 【bug】ubuntu20.04 orin nx Temporary failure resolving ‘ports.ubuntu.com‘
  • 【测试开发】---Bug篇
  • Kafka监控体系搭建:基于Prometheus+JMX+Grafana的全方位性能观测方案
  • lspci/setpci用法小结
  • 《Webpack热更新瓶颈突破:全链路优化指南》
  • C++性能优化擂台技术文章大纲
  • web3.0怎么入局
  • MySql 运维性能优化
  • 前端项目启动后,只有localhost地址,没有ip地址
  • MoonBit Meetup 杭州站丨 探讨AI基础软件的精彩回顾
  • 面向对象分析与设计40讲(6)设计原则之开闭原则
  • pandas库的基本运用
  • 传统RNN模型
  • vcs门级仿真(后仿真)指南
  • Spring、Spring MVC、Spring Boot、Spring Cloud的联系和区别
  • 异构融合 4A:重构高性能计算与复杂场景分析的安全与效率边界
  • gpt面试题
  • MCP vs 传统集成方案:REST API、GraphQL、gRPC的终极对比
  • 深入浅出Proxy与Reflect:从“黑中介“到“数据管家“的进阶之路
  • OpenCV Mat UMat GpuMat Matx HostMem InputArray等设计哲学