token过期 如何使用refresh_token实现无感刷新页面?

login.vue

<!--
 * @Descripttion: 
 * @Author: voanit
 * @Date: 2022-07-09 16:06:34
 * @LastEditors: voanit
 * @LastEditTime: 2022-07-09 16:31:11
--><template><div>
    御剑乘风来,除魔天地间!===login
    <form>
      手机号: <inputv-model="form.mobile"type="text"name=""id=""><br>
      验证码: <inputv-model="form.code"type="text"name=""id=""><br><inputtype="button"value="登录" @click="login"><!-- =={
    
    { form }} --></form></div></template><script>import { loginApi } from'@/api/user'exportdefault {
  name: '',
  data () {
    return {
      form: {
        mobile: "13455555555",
        code: "246810"
      }
    }
  },
  created () {
  },
  computed: {
  },
  methods: {
    async login () {
      const res = await loginApi(this.form)
      console.log(res, 88);
      localStorage.setItem('token', JSON.stringify(res.data))
      this.$router.push('/user')
    }
  }
}
</script><stylelang='less'scoped></style>

user.vue

<!--
 * @Descripttion: 
 * @Author: voanit
 * @Date: 2022-07-09 16:06:40
 * @LastEditors: voanit
 * @LastEditTime: 2022-07-09 16:36:18
--><template><div>
    御剑乘风来,除魔天地间!===user
    姓名:{
    
    { userInfo.name }}
    <imgstyle="width:100px":src="userInfo.photo"alt=""></div></template><script>import { userApi } from'@/api/user'exportdefault {
  name: '',
  data () {
    return {
      userInfo: {}
    }
  },
  created () {
    this.getUser()
  },
  computed: {
  },
  methods: {
    async getUser () {
      const res = await userApi()
      this.userInfo = res.data
    }
  }
}
</script><stylelang='less'scoped></style>

request.js

import axios from"axios";
var instance = axios.create({
  baseURL: "http://toutiao.itheima.net/v1_0",
  timeout: 5000,
});
const requestFreshToken = axios.create({
  baseURL: "http://toutiao.itheima.net/v1_0",
  timeout: 5000,
});

// 添加请求拦截器
instance.interceptors.request.use(
  function (config) {
    // 在发送请求之前做些什么let tokenObj = JSON.parse(localStorage.getItem("token"));
    if (tokenObj && tokenObj.token) {
      // 添加请求头
      config.headers.Authorization = "Bearer " + tokenObj.token;
    }
    return config;
  },
  function (error) {
    // 对请求错误做些什么returnPromise.reject(error);
  }
);

// 添加响应拦截器
instance.interceptors.response.use(
  function (response) {
    // 对响应数据做点什么return response.data;
  },
  asyncfunction (error) {
    // console.log(error.response, 222);if (error.response.status === 401) {
      // console.log(error, 88);/* 解决token过期的问题 */let tokenObj = JSON.parse(localStorage.getItem("token"));
      const res = await requestFreshToken({
        method: "PUT",
        url: "/authorizations",
        headers: {
          Authorization: "Bearer " + tokenObj.refresh_token,
        },
      });
      // 将使用刷新token获取的新的token存储起来
      localStorage.setItem(
        "token",
        JSON.stringify({
          token: res.data.data.token,
          refresh_token: tokenObj.refresh_token,
        })
      );
      // console.log(res, 777);//  这里重新发送请求后  使用的是request  又会走上面的请求拦截  又会重新携带刚刚存的新的tokenreturn instance(error.response.config);
    }
    // 对响应错误做点什么returnPromise.reject(error);
  }
);

exportdefault instance;

router/index.js

{
        path: "/",
        component: () => import("../tokens/login.vue"),
        name: "login",
      },
      {
        path: "/user",
        component: () => import("../tokens/user.vue"),
        name: "user",
      },

api/use.js

import request from"@/utlis/request.js";
export const loginApi = (data) => {
  return request({
    method: "post",
    url: "/authorizations",
    data,
  });
};

export const userApi = () => {
  return request({
    url: "/user",
  });
};

猜你喜欢

转载自blog.csdn.net/qq_38806666/article/details/128990251