流浪のwolf

卷帝

导航

手动检查 token 是否过期

 

 1.在 存储 token 的时候说明登录了 此时 把时间戳记录一下  js-cookies - auth.js

// 导入 js-cookie 用于操作 cookies
import Cookies from "js-cookie";

const TokenKey = "hrsacc_admin_token";
// 时间
const LoginKey = "hrsass_login_time";

export function getToken() {
  // 读取token
  return Cookies.get(TokenKey);
}

export function setToken(token) {
  // 设置token  不要 return
  //   console.log("setToken(token)");
  // 记录一下登录时候的时间戳
  Cookies.set(LoginKey, Date.now());
  Cookies.set(TokenKey, token);
}

export function removeToken() {
  // 删除 token
  return Cookies.remove(TokenKey);
}

// 读取登录的时间
export const getLoginTime = () => {
  return Cookies.get(LoginKey);
};

2.请求拦截器触发说明发送了请求在把此时的时间戳记录下来 两者之差和token 保存时间比较就可以判断token是否过期

import { Message } from "element-ui";
import axios from "axios";
// 拿去token 有2中方式
// 1. 读取 vuex 的state
// 2. 读取cookies
import store from "@/store";
import router from "@/router";
import { getLoginTime } from "./auth";

/**
 * 定义一个检查token 是否过期的方法
 */
// 2 个小时  7200000 ms 就是 时间戳 2 个小时 是 token 过期的时间期限
const tokenLoginTime = 1000 * 60 * 60 * 2;
function checkTimeOut() {
  // 当前时间 发送请求的时间 在请求拦截器调用这个函数 就是发送请求的当前时间
  const curTime = Date.now();
  // 登录时候的时间
  const loginTime = getLoginTime();
  //   当前的时间 - 登录时候的时间 如果大于 2 小时 即 7200000 说明 token 过期了
  if (curTime - loginTime > tokenLoginTime) {
    // 过期了
    return true;
  } else {
    return false; //没有过期
  }
}

// 创建了一个新的axios实例
const service = axios.create({
  // 读取环境变量文件里面的VUE_APP_BASE_API作为基准地址
  baseURL: process.env.VUE_APP_BASE_API,
  // 超时时间
  timeout: 5000,
});

/**
 * 请求拦截器
 */
service.interceptors.request.use(
  (config) => {
    // 一定要return config 否则请求发不出去
    // 统一添加 token 只有 登录请求不需要 token 其余的请求都需要 token
    if (store.getters.token) {
      // token放在了 计算属性 getters 上面了??
      console.log(
        "请求拦截器 === 登录了 === 统一添加token === 是否过期了 ",
        checkTimeOut()
      );
      // 每次请求接口的时候查看 token 是否过期了
      if (checkTimeOut()) {
        // 进来说明过期了
        Message.error("token过期了,掉毛哦,重新登录把");
        store.dispatch("user/quitAction");
        router.push("/login");
        return Promise.reject("token过期重新登录,promise.reject");
      }
      config.headers.Authorization = "Bearer " + store.getters.token;
    }
    return config;
  },
  (error) => {
    // 发生请求失败
    return Promise.reject(error);
  }
);
/**
 * 响应拦截器
 */
service.interceptors.response.use(
  (response) => {
    // 一定要return 否则请求的方法那边拿去不到任何疏忽 return什么我会获取什么数据
    const { success, code, data, message } = response.data;
    if (success) {
      // 业务成功
      Message.success("登录成功");
      //   console.log("业务成功");
      return data;
    } else {
      // 业务失败
      Message.error(message);
      //   console.log(message);
      return Promise.reject(message);
    }
  },
  (error) => {
    // 请求错误
    console.log("响应拦截器错误,token过期问题");
    console.log(error);
    if (
      error.response &&
      error.response.data &&
      error.response.data.code === 10002
    ) {
      // 此时的token过期了
      store.dispatch("user/quitAction");
      router.push("/login");
      Message.error("token过期,请重新登录");
    } else {
      Message.error("请求异常");
    }
    // 请求错误
    return Promise.reject(error);
  }
);
// 暴漏
export default service;

 

posted on 2022-10-28 14:58  流浪のwolf  阅读(1437)  评论(0编辑  收藏  举报