首页 > 其他分享 >axios封装-token过期请求中断

axios封装-token过期请求中断

时间:2023-09-15 15:56:14浏览次数:34  
标签:axios 封装 res token error return config

import axios from 'axios'
import { useUserStore } from '@/pinia'
import { ElMessage, ElMessageBox } from 'element-plus'
import qs from 'qs'

const service = axios.create({
  baseURL: '/api',
  withCredentials: false, // 是否携带cookie
  timeout: 30000 // 超时响应
})

// 字节流下载flag
let isBlob = false

const cancelToken = axios.CancelToken
let source = cancelToken.source()
// request 请求头配置
service.interceptors.request.use(
  config => {
    // userStore
    const userStore = useUserStore()

    // 根据请求头判断是否为字节流
    isBlob = config.responseType === 'blob'

    if (userStore.token) {
      // token放在请求头accessToken字段中
      config.headers.token = userStore.token
    }
    // 请求为表单时
    if (config.contentType === 'form') {
      config.headers['Content-Type'] = 'application/x-www-form-urlencoded'
    }
    // get请求包含数组时,参数进行qs序列化
    if (config.method === 'get') {
      config.paramsSerializer = params => {
        return qs.stringify(params, { arrayFormat: 'repeat' })
      }
    }
    // 请求参数为空时
    config.data = config.data || {}
    config.params = config.params || {}
    config.cancelToken = source.token // 全局添加cancelToken

    return config
  },
  error => {
    console.error(error)
    return Promise.reject(error)
  }
)

// response 响应
service.interceptors.response.use(
  response => {
    // userStore
    const userStore = useUserStore()

    const res = response.data

    // 如果为字节流,直接抛出字节流,不走status验证
    if (isBlob) {
      return response
    }

    // 后台返回非200处理
    if (res.status !== 200 && res.status !== 207) {
      ElMessage({
        message: res.message || 'Error',
        type: 'error',
        duration: 5 * 1000
      })

      // 401: token失效(2小时), 412:登录过期
      if (res.status === 401 || res.status === 412) {
        source && source.cancel('登录信息已过期') // 取消其他正在进行的请求
        const CancelToken = axios.CancelToken
        source = CancelToken.source()
        ElMessageBox.confirm('登录失效,请重新登录', '提示', {
          confirmButtonText: '重新登录',
          cancelButtonText: '取消',
          type: 'warning'
        }).then(() => {
          userStore.logout()
        })
      }

      return Promise.reject(new Error(res.message || 'Error'))
    } else {
      return res
    }
  },
  error => {
    if (axios.isCancel(error)) {
      // 取消请求的情况下,中断Promise调用链
      return new Promise(() => {})
    } else {
      ElMessage({
        message: error.message,
        type: 'error',
        duration: 5 * 1000
      })
      return Promise.reject(error)
    }
  }
)

export default service

标签:axios,封装,res,token,error,return,config
From: https://www.cnblogs.com/Cxymds/p/17705186.html

相关文章

  • 【规范】SpringBoot接口返回结果及异常统一处理,这样封装才优雅
    前言......
  • Vue2 Modal组件函数式调用封装(基于Ant Design Vue 组件)
    一、h函数(createElement函数)版本importVuefrom"vue";import{Modal}from"ant-design-vue";//获取扩展Modal组件functiongetModalConstructor(modalProps,childConfig){const{component,...restConfig}=childConfig;returnVue.extend({......
  • 封装一个用来获取多层数组对象的最后一层对象集合
    //获取多层数组对象的最后一层的对象functiongetAllIds(tree:any,result:any){//遍历树获取id数组for(constiintree){if(tree[i].id)result.push(tree[i]);//遍历项目满足条件后的操作if(tree[i].children){//存在子节点就递归ge......
  • Python接口自动化之Token详解及应用
    问题:在写接口自动化框架时,使用token鉴权后一直不生效,我是把"token:XX"放在请求头header里,调用接口时一直提示登录失效(鉴权失败),然后我就把token发到data中,还是不行,一直困扰着一、Token基本概念及原理1.Token作用为了验证用户登录情况以及减轻服务器的压力,减少频繁的查询数据库,使......
  • 【CVPR2022】Shunted Self-Attention via Multi-Scale Token Aggregation
    来自CVPR2022基于多尺度令牌聚合的分流自注意力论文地址:[2111.15193]ShuntedSelf-AttentionviaMulti-ScaleTokenAggregation(arxiv.org)项目地址:https://github.com/OliverRensu/Shunted-Transformer一、Introduction还是经典的ViT的历史遗留问题:ViT中的自注意力计算......
  • API NEWS | 谷歌云中的GhostToken漏洞
    欢迎大家围观小阑精心整理的API安全最新资讯,在这里你能看到最专业、最前沿的API安全技术和产业资讯,我们提供关于全球API安全资讯与信息安全深度观察。本周,我们带来的分享如下:一篇关于谷歌云中的GhostToken漏洞的文章一篇关于Gartner对零信任的看法的文章一篇身份验证攻击威胁API安......
  • axios+formdata上传多个文件(随手记录一下)
    <template><el-row><el-col:span="20":offset="4"style="text-align:left"><spanstyle="margin-left:200px">上传图片</span><el-uploadstyle="......
  • 商品查询业务之解决商品查询的缓存穿透、缓存雪崩、缓存击穿问题(封装工具类)
    商品查询业务之解决商品查询的缓存穿透、缓存雪崩、缓存击穿问题(封装工具类)核心思路如下:在原来的逻辑中,我们如果发现这个数据在mysql中不存在,直接就返回404了,这样是会存在缓存穿透问题的现在的逻辑中:如果这个数据不存在,我们不会返回404,还是会把这个数据写入到Redis中,并且将v......
  • 微信小程序 封装请求api
    封装请求地址https.jsletbaseUrl='https://XX.XXX.com/index.php/';//自己得服务器地址export{baseUrl}结构目录封装request.jsimport{baseUrl}from'./https.js'module.exports={request:function(url,methodType,data){letful......
  • 七牛云存储____生成永久性token
    //MyHtml.html<!DOCTYPEhtml><html><head><title>MyHtml.html</title><metaname="keywords"content="keyword1,keyword2,keyword3"><metaname="description"content="thi......