当前位置:首页 > 科技  > 软件

前端实现无缝刷新 Token

来源: 责编: 时间:2024-04-19 09:27:45 93观看
导读在前端开发中,经常会遇到 Token续约 的问题。对 Token 实现无缝刷新从而维护用户的登录状态无论是在开发时,还是在 面试时都是至关重要的。所以说咱们今天就来看看 Token 的无缝刷新问题。一、前端无缝刷新令牌的原理1

在前端开发中,经常会遇到 Token续约 的问题。对 Token 实现无缝刷新从而维护用户的登录状态无论是在开发时,还是在 面试时都是至关重要的。所以说咱们今天就来看看 Token 的无缝刷新问题。XGO28资讯网——每日最新资讯28at.com

XGO28资讯网——每日最新资讯28at.com

一、前端无缝刷新令牌的原理

1、令牌过期

服务器为每个令牌设置一个过期时间,通常是30分钟或1小时。在这段时间内,用户可以使用令牌来访问受保护的资源。XGO28资讯网——每日最新资讯28at.com

2、定期检查

前端应用程序在用户活动期间定期检查令牌的有效性。通常通过轮询或心跳机制实现,即定期向服务器发送请求,以验证令牌的有效性。XGO28资讯网——每日最新资讯28at.com

3、令牌刷新

如果服务器指示令牌已过期,前端应用程序立即使用refreshToken向身份验证服务器发送新请求,以获取新的访问令牌。无缝过渡:在接收到新令牌后,前端应用程序会更新本地存储的令牌,并继续以前的操作,完全不受影响。XGO28资讯网——每日最新资讯28at.com

4、示例

下面是一个简单的示例,演示如何在前端实现无缝刷新令牌:XGO28资讯网——每日最新资讯28at.com

令牌过期:假设服务器为每个令牌设置了30分钟的过期时间。XGO28资讯网——每日最新资讯28at.com

定期检查:前端应用程序每5分钟向服务器发送一次请求,检查当前令牌的有效性。XGO28资讯网——每日最新资讯28at.com

// 使用setInterval定期发送心跳请求setInterval(() => {  checkTokenValidity();}, 5 * 60 * 1000); // 5 分钟

检查令牌有效性:前端应用程序向服务器发送心跳请求以验证令牌的有效性。XGO28资讯网——每日最新资讯28at.com

async function checkTokenValidity() {  try {    const response = await fetch('/api/heartbeat', {      headers: {        Authorization: `Bearer ${localStorage.getItem('token')}`      }    });    if (!response.ok) {      // Token expired, initiate token refresh      refreshToken();    }  } catch (error) {    // Handle errors    console.error('Error checking token validity:', error);  }}

令牌刷新:如果令牌过期了,前端应用程序会向身份验证服务器发送请求,以获取一个新的访问令牌。XGO28资讯网——每日最新资讯28at.com

async function refreshToken() {  try {    const response = await fetch('/api/auth/refresh', {      method: 'POST',      headers: {        'Content-Type': 'application/json'      },      body: JSON.stringify({        refreshToken: localStorage.getItem('refreshToken')      })    });    if (response.ok) {      const data = await response.json();      // 更新本地存储的令牌      localStorage.setItem('accessToken', data.accessToken);    } else {      // 处理令牌刷新失败      console.error('Failed to refresh token:', response.status);    }  } catch (error) {    // 处理错误    console.error('Error refreshing token:', error);  }}

在这个例子中,前端应用程序通过定期检查令牌的有效性并在需要时发起刷新,从而无缝刷新令牌,确保了用户体验的流畅性。需要注意的是,出于安全原因,令牌刷新也应该有一个过期时间,并且在过期后用户可能需要重新登录。XGO28资讯网——每日最新资讯28at.com

二、在令牌刷新过程中处理请求

如果在令牌刷新进行中并且新令牌尚未到达时发送额外的请求,可能会遇到以下这种情况:XGO28资讯网——每日最新资讯28at.com

如果服务器检测到一个过期的令牌,可能会返回401未经授权或类似的错误状态。在这种情况下,你需要捕获这些错误并在捕获到错误时尝试使用新令牌重新发送请求。XGO28资讯网——每日最新资讯28at.com

为处理这些情况,可以采取以下策略:XGO28资讯网——每日最新资讯28at.com

1、错误处理

确保你的应用能够捕获和处理 401 Unauthorized 或相关的错误。捕获这些错误后,尝试使用新令牌重新发送请求。XGO28资讯网——每日最新资讯28at.com

2、请求重试机制

实现一个请求重试机制,自动或手动重新尝试使用新令牌的失败请求。你可以使用指数退避策略来避免频繁的重试和减少服务器负载。XGO28资讯网——每日最新资讯28at.com

3、状态管理

在令牌刷新期间,将应用程序状态设置为“刷新令牌”,并防止新请求,直到获得新令牌为止。这可以防止使用无效令牌发送更多的请求。XGO28资讯网——每日最新资讯28at.com

4、请求排队

在令牌过期后,将请求排队,等待获得新令牌后再逐个发送请求。可以使用Promise.all或其他异步处理技术来实现这一点。XGO28资讯网——每日最新资讯28at.com

5、前端通知

在令牌过期后,在前端显示通知,告知用户有关正在进行的令牌刷新过程以及需要等待或有可能重新登录的需要。XGO28资讯网——每日最新资讯28at.com

以下是一个简化的代码示例,演示了在捕获到401错误后如何使用新令牌重新发送请求。XGO28资讯网——每日最新资讯28at.com

假设这是你的API请求函数:XGO28资讯网——每日最新资讯28at.com

async function apiRequest(url, token) {  try {    const response = await fetch(url, {      headers: {        Authorization: `Bearer ${token}`      }    });    if (!response.ok) {      throw new Error(`Request failed with status ${response.status}`);    }    return response.json();  } catch (error) {    if (error.message.includes('401') && newToken) {      // 尝试使用新令牌重新发送请求      return apiRequest(url, newToken);    }    throw error;  }}// 假设这是你的 token 刷新功能let newToken = null; // 用于存储新令牌的变量async function refreshToken() {  try {    const response = await fetch('/api/auth/refresh', {      // ... 发送刷新请求的代码 ...    });    if (response.ok) {      const data = await response.json();      newToken = data.token;    }  } catch (error) {    // 处理错误  }}// 当令牌到期时调用此函数async function handleTokenExpiration() {  try {    // 尝试刷新令牌    await refreshToken();    // 假设这是之前因令牌过期而失败的请求的数组    const failedRequests = [/* ... */];    // 使用新令牌重新发送请求    for (const request of failedRequests) {      try {        const response = await apiRequest(request.url, newToken);        // 处理响应或更新应用程序状态      } catch (error) {        // 处理请求重新发送期间的错误      }    }  } catch (error) {    // 处理令牌刷新或请求重新发送期间的错误  }}

在这个示例中,apiRequest函数检查 401 错误,并在有新令牌时尝试重新发送请求。handleTokenExpiration函数通过刷新令牌并使用新令牌重新发送先前失败的请求来处理令牌过期问题。XGO28资讯网——每日最新资讯28at.com

三、排队请求

请求排队的实现依赖于使用队列数据结构来管理待处理请求。当由于某些条件(例如,令牌过期)需要延迟处理请求时,请求将被添加到队列中,等待条件满足(例如,获取新令牌)后再进行处理。XGO28资讯网——每日最新资讯28at.com

下面是一个简单的示例,演示了如何实现请求排队:XGO28资讯网——每日最新资讯28at.com

1、创建一个请求队列

首先,你需要一个队列来存储待处理的请求。这个队列可以是一个数组,内存中的链表,或者使用现有的队列库(例如JavaScript中的Array.prototype.queue或queue-promise)。XGO28资讯网——每日最新资讯28at.com

let requestQueue = []; // 使用数组作为简单的队列实现

2、排队操作

当请求需要延迟时,请将其添加到队列的末尾。XGO28资讯网——每日最新资讯28at.com

function enqueueRequest(request) {  requestQueue.push(request);}

3、出队操作

当满足条件时(例如,获取新令牌),将请求从队列前端出队进行处理,并重复直到队列为空。XGO28资讯网——每日最新资讯28at.com

async function dequeueAndProcessRequests() {  while (requestQueue.length > 0) {    const request = requestQueue.shift(); // 从队列前面撤回请求    try {      const response = await processRequest(request); // 处理该请求      // 处理响应或更新应用程序状态    } catch (error) {      // 处理请求处理期间的错误      console.error('Error processing request:', error);    }  }

4、处理请求

该 processRequest 函数处理实际的请求处理逻辑,例如发送 HTTP 请求或更新 UI。XGO28资讯网——每日最新资讯28at.com

async function processRequest(request) {  // 实际请求处理逻辑,例如发送HTTP请求  const response = await fetch(request.url, {    headers: {      Authorization: `Bearer ${newToken}` // 使用新的 token    }  });  return response.json(); // 返回处理结果}

5、使用示例

当令牌过期时,将需要延迟的请求排队,然后尝试刷新令牌。获得新令牌后,将请求从队列中出列并处理它们。XGO28资讯网——每日最新资讯28at.com

// 假设这是由于令牌过期而需要延迟的请求const delayedRequest = { url: '/api/data' };// 将请求排队enqueueRequest(delayedRequest);// 尝试刷新令牌await refreshToken();// 处理队列中的请求await dequeueAndProcessRequests();


XGO28资讯网——每日最新资讯28at.com

本文链接://www.dmpip.com//www.dmpip.com/showinfo-26-84014-0.html前端实现无缝刷新 Token

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 金三银四!分享度小满的前端面经,考Vue考的比较多

下一篇: 入门实战,Dioxus Rust 用户界面开发框架,哇真香!

标签:
  • 热门焦点
  • 7月安卓手机好评榜:三星S23Ultra好评率第一

    7月安卓手机好评榜:三星S23Ultra好评率第一

    性能榜和性价比榜之后,我们来看最后的安卓手机好评榜,数据来源安兔兔评测,收集时间2023年7月1日至7月31日,仅限国内市场。第一名:三星Galaxy S23 Ultra好评率:95.71%在即将迎来新
  • 拼多多APP上线本地生活入口,群雄逐鹿万亿市场

    拼多多APP上线本地生活入口,群雄逐鹿万亿市场

    Tech星球(微信ID:tech618)文 | 陈桥辉 Tech星球独家获悉,拼多多在其APP内上线了“本地生活”入口,位置较深,位于首页的“充值中心”内,目前主要售卖美食相关的
  • 本地生活这块肥肉,拼多多也想吃一口

    本地生活这块肥肉,拼多多也想吃一口

    出品/壹览商业 作者/李彦编辑/木鱼拼多多也看上本地生活这块蛋糕了。近期,拼多多在App首页“充值中心”入口上线了本机生活界面。壹览商业发现,该界面目前主要
  • 新电商三兄弟,“抖快红”成团!

    新电商三兄弟,“抖快红”成团!

    来源:价值研究所作 者:Hernanderz 随着内容电商的概念兴起,抖音、快手、小红书组成的“新电商三兄弟”成为业内一股不可忽视的势力,给阿里、京东、拼多多带去了巨大压
  • 一条抖音4亿人围观 ! 这家MCN比无忧传媒还野

    一条抖音4亿人围观 ! 这家MCN比无忧传媒还野

    作者:Hiu 来源:互联网品牌官01 擦边少女空降热搜,幕后推手曝光被网友誉为“纯欲天花板”的女网红井川里予,近期因为一组哥特风照片登上热搜,引发了一场互联网世界关于
  • SN570 NVMe SSD固态硬盘 价格与性能兼具

    SN570 NVMe SSD固态硬盘 价格与性能兼具

    SN570 NVMe SSD固态硬盘是西部数据发布的最新一代WD Blue系列的固态硬盘,不仅闪存技术更为精进,性能也得到了进一步的跃升。WD Blue SN570 NVMe SSD的包装外
  • 苹果MacBook Pro 2021测试:仍不支持平滑滚动

    苹果MacBook Pro 2021测试:仍不支持平滑滚动

    据10月30日9to5 Mac 消息报道,苹果新的 14 英寸和 16 英寸 MacBook Pro 2021 上市后获得了不错的评价,亮点包括行业领先的性能,令人印象深刻的电池续航,精美丰
  • 上海举办人工智能大会活动,建设人工智能新高地

    上海举办人工智能大会活动,建设人工智能新高地

    人工智能大会在上海浦江两岸隆重拉开帷幕,人工智能新技术、新产品、新应用、新理念集中亮相。8月30日晚,作为大会的特色活动之一的上海人工智能发展盛典人工
  • 电博会与软博会实现

    电博会与软博会实现"线下+云端"的双线融合

    在本次“电博会”与“软博会”双展会利好条件的加持下,既可以发挥展会拉动人流、信息流、资金流实现快速交互流动的作用,继而推动区域经济良性发展;又可以聚
Top
Baidu
map