首页 > 其他分享 >Axios 拦截器示例(JWT 登录与自动刷新)

Axios 拦截器示例(JWT 登录与自动刷新)

时间:2024-11-15 17:12:07浏览次数:1  
标签:拦截器 示例 JWT axiosInstance refresh access token error response

1. 安装 axios

首先,确保你已经安装了 axios

npm install axios

2. 设置 Axios 拦截器

import axios from 'axios';

// 创建一个 axios 实例
const axiosInstance = axios.create({
  baseURL: 'http://localhost:8000/',  // 后端 API 地址
  timeout: 10000,  // 设置超时时间
});

// 请求拦截器
axiosInstance.interceptors.request.use(
  config => {
    // 从 localStorage 获取 access_token
    const token = localStorage.getItem('access_token');
    
    if (token) {
      // 如果存在 access_token,就将它添加到请求头
      config.headers['Authorization'] = `Bearer ${token}`;
    }
    
    return config;
  },
  error => {
    // 请求失败时的处理
    return Promise.reject(error);
  }
);

// 响应拦截器
axiosInstance.interceptors.response.use(
  response => {
    return response;
  },
  async error => {
    const originalRequest = error.config;
    
    // 如果响应的错误是 token 过期
    if (error.response && error.response.status === 401 && !originalRequest._retry) {
      originalRequest._retry = true;
      
      try {
        // 尝试用 refresh_token 刷新 access_token
        const refreshToken = localStorage.getItem('refresh_token');
        
        const response = await axios.post('http://localhost:8000/api/token/refresh/', {
          refresh: refreshToken,
        });

        const { access } = response.data;

        // 更新 access_token
        localStorage.setItem('access_token', access);

        // 设置新的 access_token 并重新发起原始请求
        axiosInstance.defaults.headers['Authorization'] = `Bearer ${access}`;
        originalRequest.headers['Authorization'] = `Bearer ${access}`;
        
        return axiosInstance(originalRequest);
      } catch (err) {
        // 刷新 token 失败时的处理(例如 token 已过期或无效)
        console.error('Token refresh failed:', err);
        // 这里可以选择登出操作或其他处理
        localStorage.removeItem('access_token');
        localStorage.removeItem('refresh_token');
        window.location.href = '/login';  // 重定向到登录页面
      }
    }
    
    return Promise.reject(error);
  }
);

export default axiosInstance;

3. 如何使用这个 Axios 实例

在你的项目中,使用 axiosInstance 来进行 API 请求,它会自动处理 Authorization 头以及 token 刷新逻辑。

import axiosInstance from './path/to/axiosInstance';

// 示例:登录请求
function login(username, password) {
  axiosInstance.post('api/login/', { username, password })
    .then(response => {
      const { access, refresh } = response.data;
      localStorage.setItem('access_token', access);
      localStorage.setItem('refresh_token', refresh);
    })
    .catch(error => {
      console.error('Login failed:', error);
    });
}

// 示例:获取受保护资源
function getProtectedData() {
  axiosInstance.get('api/protected-endpoint/')
    .then(response => {
      console.log('Protected data:', response.data);
    })
    .catch(error => {
      console.error('Failed to fetch protected data:', error);
    });
}

4. 解释代码

  1. 请求拦截器:每次请求发送前都会检查 localStorage 中是否有 access_token,如果有,它会将 access_token 加入请求头 Authorization 中。

  2. 响应拦截器

    • 如果返回的状态码是 401(即 token 过期或无效),拦截器会使用存储的 refresh_token 来刷新 access_token
    • 刷新成功后,它会将新的 access_token 存储到 localStorage 中,并重新发起原始请求。
    • 如果刷新失败(例如,refresh_token 已失效),会移除所有 token,并重定向到登录页面。

这样,每个 API 请求都会自动带上最新的 access_token,并且在 token 过期时会自动刷新,保证用户的会话始终有效。

标签:拦截器,示例,JWT,axiosInstance,refresh,access,token,error,response
From: https://www.cnblogs.com/win1998/p/18548293

相关文章

  • JWT 登录与注销示例
    1.后端(Django+DRF)实现安装依赖首先,确保安装了django-rest-framework和django-rest-framework-simplejwt:pipinstalldjangorestframeworkpipinstalldjangorestframework-simplejwt配置settings.py#settings.pyINSTALLED_APPS=[...'rest_framework'......
  • Code128编码规则及示例
    编码格式​空白区域起始字符数据区域校验码结束字符空白区域所有字符条纹图像都是以黑色开始,白色结束,只有结束字符例外起始字符由于128码有三个字符集。所以有三个起始字符。 字符集包含字符值bsStartA全部大写字母和标点符号和特殊符号{2,1,1......
  • 鸿蒙Navigation拦截器实现页面跳转登录鉴权方案
    我们在进行页面跳转时,很多情况下都得考虑登录状态问题,比如进入个人信息页面,下单交易页面等等。在这些场景下,通常在页面跳转前,会先判断下用户是否已经登录,若已登录,则跳转到相应的目标页面,若没有登录,则先跳转到登录页面,然后等着获取登录状态,若登录页面关闭时,能获取到已登录,则继续跳......
  • SpringBoot中监听器、过滤器、拦截器和AOP详解
    SpringBoot中监听器、过滤器、拦截器和AOP详解在构建SpringBoot应用程序时,监听器(Listener)、过滤器(Filter)、拦截器(Interceptor)和面向切面编程(AOP)是四种常用的机制,它们各自有不同的用途和执行时机。本文将详细介绍这四种技术的执行时机和区别,并附上示例代码帮助理解。1.......
  • 鸿蒙NEXT应用示例:切换图片动画
     【引言】在鸿蒙NEXT应用开发中,实现图片切换动画是一项常见的需求。本文将介绍如何使用鸿蒙应用框架中的组件和动画功能,实现不同类型的图片切换动画效果。【环境准备】电脑系统:windows10开发工具:DevEcoStudioNEXTBeta1BuildVersion:5.0.3.806工程版本:API12真机:ma......
  • python调用扣子coze智能体示例
    """版本号:1.0日期:2024/11/14描述:"""importuuidimportjwtimporttimeimportrequests#OAuth应用的相关信息,需从扣子平台获取并替换APP_ID=""#auth应用idPUBLIC_KEY_FINGERPRINT=""#公钥PRIVATE_KEY_PATH="private_......
  • layui-laydate时间日历控件详细示例
     layui下载地址:http://www.layui.com/此控件可使用layui或者独立版的layDate,两者初始化有些不同1.在layui模块中使用layui.code<!DOCTYPEhtml><html><head><metacharset="utf-8"><title>layDate快速使用</title><linkrel="stylesheet"......
  • 原子类保证多线程环境下的数据安全的示例
    原子类保证多线程环境下的数据安全的示例 1、原子整型类保证多线程环境下的数据安全示例:packagecom.joyupx.cms.example.thread.concurrent.atomic;importlombok.extern.slf4j.Slf4j;importjava.util.concurrent.atomic.AtomicInteger;/***原子性操作*多线程......
  • Arduino语法详解_含示例详解
    Arduino的程序可以划分为三个主要部分:结构、变量(变量与常量)、函数。  结构部分 一、结构1.1setup()1.2loop()二、结构控制2.1if2.2if...else2.3for2.4switchcase2.5while2.6do...while2.7break2.8continue2.9return2.10goto三、扩展语法......
  • Jmeter (5.6.3) Windows 使用示例
    步骤:1.下载apache-jmeter-5.6.3.zip2.解压,在环境变量Path中,新增jMeter的bin文件夹的路径3.在bin文件夹中,双击jmeter.bat->打开JMeter4.在JMeter的窗口中:文件->新建(创建测试计划)5.测试计划右键:添加->线程(用户)->线程组6.线程组右键:添加->取样器->HTTP请求7.HTTP请......