token无感刷新

关于实现token无感刷新的解决方案 问题引入 在开发中为了安全或满足分布式场景,通常会舍弃原有的session认证手段,而采用jwt(json web token);但是使用token难免遇到token有效期的问题,如果token长期有效,服务端不断发布新的token,导致有效的token越来越多,这必然是存在安全问题的。而token不想session一样,在用户操作时会进行刷新,为了用户体验,这个刷新就需要自己实现。 方案 一、使用旧token获取新token 如果采取单个token的方式要实现token的自动刷新,就必须使用定时器,每隔一 阅读详情

在前端应用中,常常需要处理因token过期而导致的请求失败的情况。我们可以将这些失败的请求挂起,待token刷新成功后重试这些请求。以下是一个实现细节:

基本思路

  1. 拦截请求失败: 使用请求库(如Axios)拦截请求错误,判断是否因token过期而失败。
  2. 存储挂起请求: 将这些请求存储在一个数组中,以便在token刷新成功后重试。
  3. 刷新token: 当检测到token过期时,触发刷新token的请求。
  4. 重试挂起请求: 在token刷新成功后,重新发送挂起的请求。

实现步骤

以下是一个使用Axios的示例:

import axios from 'axios';

// 创建一个Axios实例
const apiClient = axios.create();

// 挂起请求的数组
let pendingRequests = [];

// 是否正在刷新token
let isRefreshing = false;

// 请求拦截器,添加token到请求头
apiClient.interceptors.request.use(config => {
    const token = localStorage.getItem('access_token');
    if (token) {
        config.headers['Authorization'] = `Bearer ${token}`;
    }
    return config;
}, error => {
    return Promise.reject(error);
});

// 响应拦截器,处理token过期
apiClient.interceptors.response.use(response => {
    return response;
}, error => {
    const { config, response } = error;
    const originalRequest = config;

    // 检查是否是token过期错误(假设401表示过期)
    if (response && response.status === 401) {

        // 如果已经在刷新token,将请求挂起
        if (isRefreshing) {
            return new Promise((resolve, reject) => {
                pendingRequests.push({ resolve, reject });
            }).then(token => {
                originalRequest.headers['Authorization'] = `Bearer ${token}`;
                return axios(originalRequest);
            }).catch(err => {
                return Promise.reject(err);
            });
        }

        // 开始刷新token
        isRefreshing = true;

        return new Promise((resolve, reject) => {
            refreshToken()  // 假设一个刷新token的方法
                .then(newToken => {
                    localStorage.setItem('access_token', newToken);
                    apiClient.defaults.headers['Authorization'] = `Bearer ${newToken}`;
                    originalRequest.headers['Authorization'] = `Bearer ${newToken}`;

                    // 重新发送所有挂起的请求
                    pendingRequests.forEach(req => {
                        req.resolve(newToken);
                    });

                    pendingRequests = [];
                    resolve(axios(originalRequest));
                })
                .catch(err => {
                    pendingRequests.forEach(req => {
                        req.reject(err);
                    });

                    pendingRequests = [];
                    reject(err);
                })
                .finally(() => {
                    isRefreshing = false;
                });
        });
    }

    return Promise.reject(error);
});

// 模拟刷新token的函数
function refreshToken() {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            const newToken = 'new-token-value';  // 假设获得了新token
            resolve(newToken);
        }, 1000);
    });
}

说明

  • 挂起请求: 当检测到token过期,且当前正在刷新token时,将请求存储在pendingRequests数组中。
  • 刷新token过程: 当刷新token成功后,遍历pendingRequests数组,使用新的token重试请求。
  • 状态管理: 使用isRefreshing标志来避免同时发起多个token刷新请求。

这个实现确保了API请求在token过期时不会被丢弃,而是等待token刷新后继续执行。根据实际需求,你可能需要调整token存储和获取的方式

无感刷新 token 又因为无论是 access token 还是 refresh token 都是放在请求头的 authorization 上携带,此时请求拦截设置的 access token 就会覆盖掉 refresh token,导致刷新接口拿不到 refresh token。前一个刷新请求还没拿到最新的 access token,后一个刷新请求又发出了,这就出现了并发刷新 token ,冗余发送请求的情况。在请求拦截器中保存当前请求的url到数组中,后续的请求都需要判断一下,当前请求的url是否已经在数组中。 阅读详情

相关推荐

Token已过期,我是如何实现无感刷新Token的?

无感刷新Token这个功能,用户成功的时候,是感知不到它的存在的。但恰恰是这种无感的细节,区分出了一个能用的应用和一个好用的应用。因为一个资深的开发者,他不仅关心功能的实现,更应该关心用户体验和整个系统的健壮性。希望这一套解决思路,能对你有所帮助🤞😁。在实际项目中,你可能还需要根据具体的业务场景进行调整,比如添加重试次数限制、更完善的错误处理等。但核心的思路和实现方式都是相通的。掌握了这个技术,你就能让用户在使用你的产品时,再也不用担心因为Token过期而被迫中断操作了!

我爱娃哈哈的专栏 1818

axios 并发请求时,刷新token的处理方法

背景: 后端设计token 过期时间是四个小时,但有一个用户总是挂着账号,然后就投诉了好几次,账号明明登录着为啥就让我重新登录, 说什么token过期,哎 对客户来说 这个确实是个难以忍受的 bug算是吧。 想起来大学的时候学过 软件测试。什么是bug。bug就是没有达到需求的都可以叫做是bug 当时可能有点广泛哈。???? 有点扯远了其实这个问题 我们可以理清下思路哈 首先并发请求 肯定不至于 每一个都需要去刷新token 只需要第一个知道过期的那个请求去刷新就可以。 这个时候需要我们怎么做呢?就是搞

业余前端的职业经历 1826

STM32L476低功耗实战:LPTIM精准定时唤醒STOP2模式与系统级功耗优化

本文深入探讨了STM32L476低功耗实战技巧,重点解析了LPTIM精准定时唤醒STOP2模式的配置与优化。通过详细的步骤指南和实战经验分享,帮助开发者实现系统级功耗优化,特别适合电池供电设备开发。文章涵盖LPTIM1定时器配置、STOP2模式进入流程及常见问题排查,助力将整机功耗降至8.2uA级别。

weixin_33686714的博客 435

前端axios实现登入过期token拦截刷新

token如果设置过期时间太短,安全性提高了,但用户体验下降了,你也不想在入录表单的时候数据填好了,一保存就给我跳转到登入页面吧,这种情况相当炸裂,之前的操作都要重新来一遍了。不少管理系统都使用了token机制,虽然token有不少优点。但缺点也明显,例如: 如果token我们后台签发了,给盗用了,常规情况下我们没办法让token主动过期,如果要想让token主动过期,我们得配合redis中间件。axios二次封封装,导入refresh-token.ts在axios响应拦截器处理刷新token。

qq_59517460的博客 2080

Informer:比Transformer更有效的长时间序列预测

目录 AAAI 2021最佳论文:比Transformer更有效的长时间序列预测 Background Why attention Methods:the details of Informer Solve_Challenge_1:最基本的一个思路就是降低Attention的计算量,仅计算一些非常重要的或者说有代表性的Attention即可,一些相近的思路在近期不断的提出,比如Sparse-Attention,这个方法涉及了稀疏化Attention的操作,来减少Attention计算量,然后涉及的

To be a better man 1万+

Tesla V100 Windows 部署实战:从驱动安装到模式切换的避坑指南

本文是一份详细的Tesla V100在Windows系统下的部署实战指南。文章从硬件组装、系统选择讲起,重点阐述了驱动安装的正确方法,并深入剖析了将计算卡从TCC模式切换至WDDM模式的诱惑与潜在陷阱。最终,作者推荐保持默认TCC模式,并提供了使用nvidia-smi命令行等稳定可靠的显卡监控方案,旨在帮助用户避开常见坑点,高效利用这张专业计算卡进行AI计算等任务。

java5的博客 1706

axios实现token过期时自动重新刷新,并让之前的请求重新再发一次请求,实现请求重发,而让调用的的人无感

axios 请求重发 同一个请求

weixin_45133990的博客 1285

ubuntu虚拟机搭建OP-TEE

在网上找了一些搭建OP-TEE的过程,模仿着进行搭建,结果有好多报错,为了方便自己以后重新搭建,所以将整个过程记录下来。

weixin_44213847的博客 998

配置项目请求地址和axios以及实现token过期无痛刷新

配置项目的请求地址,根据当前项目的版本状态来动态匹配请求地址,以及实现请求日志、token过期处理、账户封禁处理、服务器错误处理、响应成功处理

分享互联网的有趣知识~ 1634

使用Google Earth Engine下载JRC全球水体数据

通过Google Earth Engine平台和提供的源代码,研究人员和水资源管理者可以方便地获取和利用这一重要的水资源监测数据集,从而开展相关的研究和决策支持工作。要使用Google Earth Engine下载JRC全球水体数据,首先需要在Google Earth Engine平台上进行注册和登录。JRC全球水体数据是由欧洲联合研究中心开发的高分辨率全球水体分类数据集,覆盖了整个地球的陆地和水域。下载完成后,你可以使用各种遥感数据处理软件来打开和分析这些数据,以满足不同的研究和应用需求。

LrlDebug的博客 1158

【100%通过率】华为od机试C卷【贪吃的猴子】Java&Go 实现

一只贪吃的猴子,来到一个果园,发现许多串香蕉排成一行,每串香蕉上有若干根香蕉。每串香蕉的根数由数组numbers给出。猴子获取香蕉,每次都只能从行的开头或者未尾获取,并且只能获取N次,求猴子最多能获取多少根香蕉。第一次获取香蕉为行的开头,第二次获取为行的末尾,因此最终根数为4+3 =7。全部获取所有的香蕉,因此最终根数为1+2+3 = 6。第二行为数组numbers的值每个数字通过空格分开。1:简单题目,两个指针分别指向头尾,逐个对比即可。第一行为数组numbers的长度。第三行输入为N,表示获取的次数。

MISAYAONE的博客 1435

vue中axios请求时遇到Token请求过期重新获取Token自动发起上次失败请求逻辑

axios请求发生错误时,被设置的错误拦截器捕获到之后,带了2个参数,第一个是请求对象,第二个是请求错误对象,请求错误对象中带有请求config,在处理完成Token过期逻辑后,使用请求对象和错误对象中的请求参数,再次发起请求。

xihadddd的博客 1160

Coze智能体开发:扣子空间制作PPT功能

扣子空间内置了丰富的场景模板,涵盖人文历史、学术分享、研究报告、数据分析等场景,可以满足不同用户的需求。 你只需输入与制作 PPT 相关的提示词,Agent 就能基于这些提示词展示思考的过程,并自动生成完整的 PPT。

王国平的博客 2052

双token的无感刷新

作为计算机术语时,是“令牌”的意思。Token是服务端生成的一串字符串,以作客户端进行请求的一个令牌,当第一次登录后,服务器生成一个Token便将此Token返回给客户端,以后客户端只需带上这个Token前来请求数据即可,无需再次带上用户名和密码。

2301_81801630的博客 2417

12、认知地图的建模与学习

本博客系统介绍了认知地图的定义、背景及其在机器智能领域的应用,重点探讨了模糊认知地图(FCMs)的建模方法与优势。文章还对比分析了几种主流的认知地图模型(如Axelrod模型、Kosko模型等),并讨论了模型的稳定性条件及实际应用前景。通过智能制造和医疗诊断的具体案例,展示了认知地图在复杂因果推理中的强大能力,并提出了模型优化方向与未来研究展望。

plant的博客 209

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

实现Token无感刷新

通过 Axios 的请求拦截器和响应拦截器,可以实现 Token 的无感刷新,从而提升用户体验。关键在于:在 Token 过期前主动刷新。处理并发请求和错误情况。确保 Token 存储和传输的安全性。这种方法适用于大多数前后端分离的项目,能够有效减少用户因 Token 过期而需要重新登录的情况。

qq_43284411的博客 2056

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Vue 无感刷新token

Vue 无感刷新token,刷新token的解决方案

前端菜鸟好先森的博客 6153

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

双Token实现无感刷新

服务端把用户信息放入token里,设置一个过期时间,客户端请求的时候通过的header携带token,服务端验证通过,就可以从中取到用户信息。token是有过期时间的,比如3天,那过期后再访问就需要重新登录了。这样体验并不好。想想你在用某个app的时候,用着用着突然跳到登录页了,告诉你需要重新登录了。是不是体验很差?所以要加上续签机制,也就是延长token过期时间。主流的方案是通过双token,一个、一个。登录成功之后,返回这两个token访问接口时带上访问:当过期时,通过来刷新,拿到新的。

New_user_的博客 3405

双token无感刷新

双token无感刷新是一种在Web开发中常用的安全及用户体验优化技术,主要涉及到两种类型的token:Access Token(访问令牌)和Refresh Token(刷新令牌)。以下是对双token无感刷新的详细解释

stc_ljc的博客 2629

token 无感刷新

什么是 token 无感刷新?为什么需要 token 无感刷新?让我们想象一下有这么个场景:你登录一个系统成功后,玩了 10 分钟,发现登录失效了,又要你重新登录,然后又过 10 分钟,又失效了,又要重新登录,难不难受,那这是怎么造成的?是因为权限 token 有效时间很短造成的,不要问,为什么权限 token 过期时间这么短,因为需要实现单点登录。那什么是单点登录呢?请参考。在单点登录模式下,服务器在我们登录成功后发了两个 token 给我们,一个有效时间短的(有效时间 10 分钟),一个有效时间长的。

weixin_64684095的博客 916

用 Axios 封装一个双 token 无感刷新

为了保证安全性,后端设置的Token不可能长期有效,过了一段时间Token就会失效。而发送网络请求的过程又是需要携带Token的,一旦Token失效,用户就要重新登陆,这样用户可能需要频繁登录,体验不好。为了解决这个问题,采取双Token(Access_Token,Refresh_Token)无感刷新,用户完全体会不到Token的变化,但实际上,Token已经刷新了。

猿特佳 2320

前端双token无感刷新详解

在介绍双token无感刷新之前,我们先简单介绍一下什么是token吧!token是一种用户标识,表示用户身份,类似于我们的身份证件。Token是在服务端产生的。如果前端使用用户名/密码向服务端请求认证,服务端认证成功,那么在服务端会返回Token给前端。前端可以在每次请求的时候带上Token证明自己的合法地位。如果这个Token在服务端持久化(比如存入数据库),那它就是一个永久的身份令牌。

小庄zzz的博客 2481

如何做到无感刷新token?

如何做到无感刷新token?

abcafdsgr123456789的博客 1282

VUE前端实现token的无感刷新

说实话,这个其实没啥好讲的,要说有复杂度的话,也主要是在后端。实现token无感刷新对于前端来说是一项十分常用的技术,其本质都是为了优化用户体验,当token过期时不需要用户调回登录页重新登录,而是当token失效时,进行拦截,发送刷新token的请求,获取最新的token进行覆盖,让用户感受不到token已过期。

老电影故事的博客 1万+
上一篇: 微信问题总结(onpageshow ,popstate事件)
下一篇: requestAnimationFrame粗解
jsPao
博客等级 码龄7年 549粉丝 107原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值