Failed to load resource: the server responded with a status of 401 (UNAUTHORIZED) 解决token失效 401错误码

在这里我们要对别人的错误状态进行判断,来使用刷星token 解决token失效的 401的问题, 让别人在后台看不见的地方,登陆失败,然后里面调用这里的请求,再获取最新的token值,然后重新设置到我们的本地存储里面去

import axios from 'axios';
import config from '@/config/url.config';
import { setItem, getItem } from '@/utils/storage';
import router from '../router';

const request = axios.create({
  baseURL: config.baseURL,
});

const whiteList = ['authorizations'];

// 在请求拦截器里面,给所有的请求 设置一个功能的请求头 authorization; 就是一个令牌,就是一个身份的作用,因为http协议是没有状态,别人不知道我们有没有登录;
request.interceptors.request.use(
  function(config1) {
    // console.log('请求拦截器的打印:', config1);
    // config1.headers.Authorization = 'Bearer ' + getItem().token;
    // 在给所有请求添加token的时候,要做一个路由白名单的校验; 比如登录,注册,发验证码等请求,因为它们根本就没有进入系统,也就没有token;所以不需要发
    if (!whiteList.includes(config1.url) && getItem()) {
      // null.token
      config1.headers.Authorization = `Bearer ${getItem().token}`;
    }
    return config1;
  },
  function(error) {
    return Promise.reject(error);
  }
);

request.interceptors.response.use(
  function(response) {
    // console.log('响应拦截器的打印:', response);
    return response.data;
  },
  function(error) {
    // 在这里我们要对别人的错误状态码进行判断, 来使用刷新token 解决token失效 也就是401的问题; 让别人在后台 看不见的地方,登录以失败,然后里面调用这里的请求,在获取最新的token值,然后重新设置到我们的 本地储存里面去
    console.dir(error);
    if (
      error.response &&
      error.response.status === 401 &&
      error.response.statusText === 'UNAUTHORIZED'
    ) {
      if (getItem() && getItem().refresh_token) {
        axios({
          url: 'http://ttapi.research.xxxx.cn/app/v1_0/authorizations',
          method: 'PUT',
          headers: {
            'Content-Type': 'application/x-www-form-urlencoded',
            // Authorization: 'Bearer ' + getItem().refresh_token,
            // 如果不加bearer 空格 的话,就会报错 wrong token
            Authorization: `Bearer ${getItem().refresh_token}`,
          },
        }).then((res) => {
          console.log(111, res);
          setItem({
            token: res.data.data.token, // toekn值使用最新的
            refresh_token: getItem().refresh_token, // 刷新toekn还是使用以前的,
          });
          request(error);
           router.go(0);
        });
      }
    }
    return Promise.reject(error);
  }
);

export default request;

你可能感兴趣的:(#,【Vue2移动端项目】,token,vant,前端,vue.js,vue,webapp)