首页 > 其他分享 >前端实现无感刷新token

前端实现无感刷新token

时间:2022-12-26 10:22:48浏览次数:35  
标签:return res Token 无感 token 刷新 else data response

1.在axios 返回拦截器中实现
代码如下

const service = axios.create({
  baseURL:import.meta.env.VITE_API_BASEPATH, // api 的 base_url
  timeout: 600000, // 请求超时时间
  headers: {
    'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8',
    'Sys-Code': 'SRM'
  }
})

// response 拦截器
service.interceptors.response.use(
  response => {
    tryHideFullScreenLoading();
    const res = response.data
    if (response.status === 200 && response.config.responseType === 'blob' || response.config.responseType === 'arraybuffer') { // 文件类型特殊处理
      if (response.headers['content-disposition'] || (response.headers['content-type'] && response.headers['content-type'].indexOf('application/pdf') != -1)) {
        return response
      } else {
        const resultBlob = new Blob([response.data], { type: 'application/json' })
        const fr = new FileReader()
        fr.onload = function() {
          const result = this.result ? JSON.parse(this.result) : '{}'
          if (result.msg) {
            errorMessage(result.msg, result.code == 1 ? 'success' : 'error')
          }
        }
        fr.readAsText(resultBlob)
      }
    } else if (res.code != 0) {
      // 302	登录已失效
      if (res.code === 302) {
        if (res.data && res.data.extra === 1) {
          confirmMessage(`您的账号${res.data.extraTime}在别处登录。如非本人操作,则密码可能已泄漏,建议修改密码`)
        } else {
          clearCacheEnterLogin()
        }
      } 
      else if(res.code === '000000000001'){
        if (res.msg) {
          let newMsg = res.msg.replace(/\n/g,'<br/>')
          errorMessage(newMsg,'error',true)
        }
        return res
      }else if(res.code ==='3000300100302'){
       
        const config = response.config
        const refreshToken = getLocalStorage('Refresh-Token');
        if(config.url==='/saas/auth/account/refreshToken'){
          isRefreshToken = false
          errorMessage("登录无效,请重新登录")
          delLocalStorage("Access-Token");
          delLocalStorage("Refresh-Token");
          router.push({ path: "/login" });
          return Promise.reject(res)
        }
        if(!isRefreshToken){
          isRefreshToken=true;
         return refreshTokenByServer({refreshToken:refreshToken}).then((res:any) => {
        if(res && res.code==="0"){
         setLocalStorage("Access-Token", res.data.accessToken);
         setLocalStorage("Refresh-Token", res.data.refreshToken);
         // token 刷新后将数组的方法重新执行
         requests.forEach((cb) => cb(res.data.accessToken))
         requests = [] // 重新请求完清空
        
         config.headers["Access-Token"]=res.data.accessToken;
         config.headers["Refresh-Token"]=res.data.refreshToken;
         return service(config);
        }
       })
       .catch((err) => {
        errorMessage("登录无效,请重新登录")
        delLocalStorage("Access-Token");
        delLocalStorage("Refresh-Token");
        router.push({ path: "/login" });
        return Promise.reject(err)
        }).finally(() => {
          isRefreshToken = false
        })
        }
        else {
          // 返回未执行 resolve 的 Promise
          return new Promise(resolve => {
            // 用函数形式将 resolve 存入,等待刷新后再执行
            requests.push((accessToken:any) => {
              resolve(service(config))
            })
          })
        }
      
      }
      else if(res.code ==='3000300100301'){
        errorMessage("登录无效,请重新登录")
        delLocalStorage("Access-Token");
        delLocalStorage("Refresh-Token");
        router.push({ path: "/login" });
      }
      else {
        if (res.msg) {
          errorMessage(res.msg)
        }
      }
      return Promise.reject(res)
    } 
    return res
  },
  error => {
    tryHideFullScreenLoading();
    if (error.response) {
      const response = error.response
      if (response.status == 500) {
        errorMessage('网络错误,请检查您的网络')
      } else if (response.data && response.data.msg) {
        errorMessage(response.data.msg)
      }
    }
    return Promise.reject(error)
  }
)

标签:return,res,Token,无感,token,刷新,else,data,response
From: https://www.cnblogs.com/sweetpitaya/p/17005112.html

相关文章

  • Token与JWT
    Token与JWT的区别?Token和JWT(JSONWebToken)都是用来在客户端和服务器之间传递身份验证信息的一种方式。但是它们之间有一些区别。Token是一个通用术词,可以指代......
  • 第十八节:异步补充(CancellationToken终止信号、whenAll、whenAny、yeild return的用法
    一.CancellationToken终止信号 CancelAfter()超时后发出取消信号 Cancel()发出取消信号{CancellationTokenSourcects=new();cts.CancelAfter(4000);......
  • JWT(生成Token令牌)
    .NetCore配置使用什么是JWT(详情在面试.md中有)JWT是目前最流行的跨域身份验证解决方案,JWT的原则是在服务器身份验证之后,会返回一个Json数据,,之后,当用户与服务器通信......
  • 工作总结之双token篇
    目录复盘双token方案在项目中的实际应用前言方案实现的结果复盘双token方案在项目中的实际应用前言笔者需要实现token的无感刷新,具体点说就是假设用户一直在使用,就会无......
  • 基于ZR.VUE 前端的改造,页面刷新报错
     问题描述:前后端分离开发,分开部署.页面刷新直接报404错误的解决办法提示: 先在 .env.development中配置 VUE_APP_BASE_API,将'/'替换为后端地址'http......
  • Activex感知网页刷新关闭事件
    原因大多数ActiveX控件框架,例如MFC和ATL,在本地激活ActiveX控件时创建控件。基于性能上的考虑,直到控件第一次可见的时候,IE才本地激活ActiveX控件。这样包含ActiveX控件的网......
  • ocx控件针对网页刷新和关闭分别进行区分处理
    当ocx加载在网页上时,如果对网页执行F5刷新事件,ocx控件会销毁ocx的窗口类,但是ocx的APP类是不会销毁的。只有当网页被关闭时,才销毁app类。 ----------------------------......
  • Python通过Jwt创建Token
    importtimeimportjwt#pipinstallPyJWTimporthashlibimportjsonimportbase64frompyDesimportdes,PAD_PKCS5,CBCSECRET_KEY='django-insecure-fr&......
  • 设置IDEA编辑过程直接通过F5刷新网页就可以实时查看JSP文件更新结果,而非通过重新run
     当然有部分童鞋反映这样设置了以后,部分css样式表修改了还是不管用,那么我们就需要针对浏览器做点骚操作了:1.chrome(谷歌浏览器)(1)、F12在调试页面Network中勾选Disablecach......
  • .net core 5,6,7【多线程笔记】取消令牌(CancellationToken)
    介绍在使用C#异步的场景,多多少少会接触到CancellationTokenSource。它和取消异步任务相关的,CancellationToken就是它生产出来的。演示任务取消执行回调vartokenSource......