推广

Token过期处理

iseeyu2年前 (2024-02-21)推广130

我多次请求用户信息,就会回到登录页面

通过浏览器的开发者工具观察,有两次的刷新Token请求,由于两次的刷新token携带的refresh_token相同,会导致一次成功一次失败,失败的那一次会导致页面跳转请求页

为了避免多次请求刷新Token,可以通过一个变量isRefreshing标记Token的刷新状态

  • 默认状态为false,并且在发送刷新Token请求前检测,状态是false才能发送
  • 发送刷新请求的时候,设置标记为true
  • 请求完毕,设置为false
// layout/components/app-header.vue
...
// 是否正在更新 Token
let isRefreshing = false

request.interceptors.response.use(function (response) {
...
  } else if (status === 401) {
    if (!store.state.user) {...}
    // 发送刷新请求前判断 isRefreshing 是否存在其他已发送的刷新请求
    // 1 如果有,则将当前请求挂起,等到 Token 刷新完毕再重发,这里先设置为 return
    if (isRefreshing) {
      return
    }
    // 2. 如果没有,则更新 isRefreshing 并发送请求,继续执行后续操作
    isRefreshing = true
    // 发送刷新请求
    return request({
     ...
    }).then(res => {
      ...
    }).catch(() => {
      ...
    }).finally(() => {
      // 3 请求完毕,无论成功失败,设置 isRefreshing 为 false
      isRefreshing = false
    })
  } else if (status === 403) {
...

虽然刷新Token的题解决了,但是之前发送的两个请求只有一个成功执行,其他的请求都被阻止了
如何解决?
我们声明一个数组存储所有被挂起的请求,当Token刷新完毕再将这些请求重新发送

// 存储是否正在更新token 的状态
let isRefreshing = false
// 存储因为token刷新而挂起的请求
let requests = []
// 响应拦截器
request.interceptors.response.use(function (response) {
  // 状态码2xx会执行这里
  console.log('响应成功了', response)
  return response
}, function (error) {
  if (error.response) {
    // 请求发送成功,响应接收完毕,但是状态码为失败的情况
    // 1.判断失败的状态码情况(主要处理401的情况)
    const { status } = error.response
    let errorMessage = ''
    if (status === 400) {
      errorMessage = '请求参数错误'
    } else if (status === 401) {
      // 2.Token无效(过期)处理
      // 第一,无token信息
      if (!store.state.user) {
        redirectLogin()
        return Promise.reject(error)
      }
      // 检测是否已经存在了正在刷新token的请求
      if (isRefreshing) {
        // 将当前失败的请求存起来,存储到请求列表中
        return requests.push(() => {
          // 当前函数调用后,会自动发送本次失败请求
          request(error.config)
        })
      }
      isRefreshing = true
      // 第二,Token无效(错误Token,过期Token)
      // 发送请求,获取新的access_token
      return request({
        method: 'POST',
        url: '/front/user/refresh_token',
        data: qs.stringify({
          refreshtoken: store.state.user.refresh_token
        })
      }).then(res => {
        // -刷新token失败
        if (res.data.state !== 1) {
          // 清除无效的用户信息
          store.commit('setUser', null)
          // 封装重复的跳转登录操作
          redirectLogin()
          return Promise.reject(error)
        }
        // 刷新token成功
        // 存储新的token
        store.commit('setUser', res.data.content)
        // 重新发送失败的请求
        // 根据reques
        // 发送多次失败的请求
        requests.forEach(callback => callback())
        // 发送完毕清除requests 内容即可
        requests = []
        // 将本次请求发送
        return request(error.config)
      }).catch(err => {
        console.log(err)
      }).finally(() => {
        // 无论成功还是失败都会执行
        // 请求发送完毕,响应处理完毕,刷新状态更改为false就行了
        isRefreshing = false
      })

解决

扫描二维码推送至手机访问。

版权声明:本文由西安泽虎代运营发布,如需转载请注明出处。

转载请注明出处https://www.0291.com.cn/post/57235.html

相关文章

2022年8月房地产营销策划方案-219份

2022年8月房地产方案-219份,以下为部分列表:20220801-2020商业购物中心营销活动的产品化思考(课件)-116P.pdf20220801-2021广州立白珠江大观平层豪宅年度提报-昭阳和牧场-271P.pdf20220801-2021舒城华安·桂语公馆营销策...

什么样的企业网站在搜索引擎优化中会有更好的效果。

什么样的企业网站在搜索引擎优化中会有更好的效果。

越来越多的企业希望通过自己的网站获得搜索引擎的自然流量,因此企业网站的SEO优化已经成为许多企业常用的在线营销方法之一。然而,在的过程中,很多网站无法充分发挥其相关的营销功能,因此很多企业网站往往被建设成没有管理的空壳网站。我们追根溯源,主要是现在很多企业在网站建设中没有认真考虑自己网站的SEO效...

淘宝店铺宝在哪里设置,淘宝店铺推荐在哪里设置(淘宝卖家优惠券在哪里设置)

淘宝店铺宝在哪里设置,淘宝店铺推荐在哪里设置(淘宝卖家优惠券在哪里设置)

店铺宝可以和单品宝、搭配宝等促销工具搭配使用。淘宝卖家使用店铺宝可以设置满减、打折、包邮、送赠品、送优惠券等促销活动。...

教你全网推广如何巧妙提高转化率。

教你全网推广如何巧妙提高转化率。

很多全网推广人员都在疑惑,为什么我的网站排名靠前,关键词也在首页,却没有有效地互动和转化呢?其实排名靠前的网站,每天的流量还是很多的,至于没人咨询,可能是因为网站缺乏营销力,没有契合用户的需求,没有让用户产生共鸣,从而关闭你的网站从而去了解其他的网站。今天我们就来谈谈,全网推广如何提高转化率。...

品牌整合推广(品牌整合推广是什么)

品牌整合推广(品牌整合推广是什么)

秒速排为企业提供一站式解决方案,核心业务包含百度霸屏、企业站群推广、百家号运营,企业网站建设,百度推广、百度竞价托管、360推广、微信公众平台推广、阿里巴巴运营托管、推广、搜一搜霸屏推广,企业软文新闻推广,百家号代运营,爱采购代运营、短视频矩阵代运营、百度智能小程序矩阵推...

企业网站内链优化要怎样做才有排名。

企业网站内链优化要怎样做才有排名。

随着互联网行业的快速发展,做网络优化的人也比较多,而今很多行业关键词排名竞争度也变得越来越大,想要网站获取流量和权重,这其中还得注重一些推广策略和技巧,比如网站内链优化。那企业网站内链优化要怎样做才有排名? 1、网站主导航 重庆网站优化小编提醒,网站导航是网站内链规划中重要的一...

现在,非常期待与您的又一次邂逅

我们努力让每一部企业宣传片和抖音短视频成为商业大片