美文网首页
请求获取token

请求获取token

作者: 糖醋里脊120625 | 来源:发表于2021-08-10 13:02 被阅读0次
import externalaxios from 'axios';
import { externalApi } from '@/common/js/api';
// import {Message} from 'element-ui';
// externalaxios.defaults.timeout = 30000;
// externalaxios.defaults.baseURL = '';


// ****************************************************************************************

function getLocalToken () {
  const token = window.sessionStorage.getItem('externalLogintoken')
  return token
}


// ****************************************************************************************over

const service = externalaxios.create({
  baseURL: '',
  headers: {
    'Content-Type': 'application/json',
    'token': getLocalToken() // headers塞token
  },
})

service.setToken = (token) => {
  service.defaults.headers['token'] = token
  window.sessionStorage.setItem('externalLogintoken', token)
}


//http request 拦截器
service.interceptors.request.use( config => {
    
    if(sessionStorage.getItem("externalLogintoken")){
      var token = sessionStorage.getItem("externalLogintoken");
    }else{
      var token = null;
    }
    
    config.data = JSON.stringify(config.data);
      config.headers = Object.assign({
        'Content-Type': 'application/json;charset=UTF-8',
        'token': token,
      }, config.headers);
    return config;
  },
  error => {
    return Promise.reject(err);
  }
);


//http response 拦截器
// 是否正在刷新的标记
let isRefreshing = false
// 重试队列,每一项将是一个待执行的函数形式
let requests = []

service.interceptors.response.use(response => {
  const { code } = response.data
  console.log(code)
  if (code == 401) {
    const config = response.config
    console.log(config)
    if (!isRefreshing) {
      isRefreshing = true
      return refreshToken().then(res => {
        console.log(res.token)
        service.setToken(res.token)
        const { token } = res.token
        config.headers['token'] = res.token
        window.sessionStorage.setItem('externalLogintoken', token)
        config.baseURL = ''
        // 已经刷新了token,将所有队列中的请求进行重试
        requests.forEach(cb => cb(token))
        requests = []
        return service(config)
      }).catch(res => {
        console.error('refreshtoken error =>', res)
        //window.location.href = '/'
      }).finally(() => {
        isRefreshing = false
      })
    } else {
      // 正在刷新token,将返回一个未执行resolve的promise
      return new Promise((resolve) => {
        // 将resolve放进队列,用一个函数形式来保存,等token刷新后直接执行
        requests.push((token) => {
          config.baseURL = ''
          config.headers['token'] = token
          resolve(service(config))
        })
      })
    }
  }

    return response;
  },
  error => {
    return Promise.reject(error)
  }
)
export default service;


/**
 * 封装get方法
 * @param url
 * @param data
 * @returns {Promise}
 */
export function externalget(url, params = {}) {
  return new Promise((resolve, reject) => {
    service.get(url, {params: params})
      .then(response => {
        if(response.data.code==401){
          setTimeout(() => {
            resolve(response.data)
          }, 1000)
          // sessionStorage.clear();
          // this.$message.info("请先登录")
          // router.push({
          //   path: "/login",
          //   querry: {redirect: router.currentRoute.fullPath}//从哪个页面跳转
          // })
        }
        else {
          resolve(response.data);
        }
      })
      .catch(err => {
        reject(err)
      })
  })
}


export function externalpost(url, data = {}) {
  return new Promise((resolve, reject) => {
    service.post(url, data)
      .then(response => {
        //如果报 401  请重新登录
        if(response.data.code==401){
          
        }
        else {
          resolve(response.data);
        }
      }, err => {

        reject(err)
      })
  })
}


/**
 * 封装patch请求
 * @param url
 * @param data
 * @returns {Promise}
 */

export function patch(url, data = {}) {
  return new Promise((resolve, reject) => {
    externalaxios.patch(url, data)
      .then(response => {
        resolve(response.data);
      }, err => {
        reject(err)
      })
  })
}

/**
 * 封装put请求
 * @param url
 * @param data
 * @returns {Promise}
 */

export function put(url, data = {}) {
  return new Promise((resolve, reject) => {
    externalaxios.put(url, data)
      .then(response => {
        resolve(response.data);
      }, err => {
        reject(err)
      })
  })
}

/**
 * 封装delete方法
 * @param url
 * @param data
 * @returns {Promise}
 */
export function deletes(url, params = {}) {
  return new Promise((resolve, reject) => {
    externalaxios.delete(url, {
      params: params
    })
      .then(response => {
        resolve(response.data);
      })
      .catch(err => {
        reject(err)
      })
  })
}




function refreshToken (){
  return  externalApi.externalToken().then(res => res.data)
}


相关文章

网友评论

      本文标题:请求获取token

      本文链接:https://www.haomeiwen.com/subject/bbbxbltx.html