如何使用vuex存储token?

1,638 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第3天,点击查看活动详情

1.token是什么?

Token的定义:Token是服务端生成的一串字符串,以作客户端进行请求的一个令牌,当第一次登录后,服务器生成一个Token便将此Token返回给客户端,以后客户端只需带上这个Token前来请求数据即可,无需再次带上用户名和密码。

  • 简单来说token是一个令牌,是用户使用账户密码登录后给予的一个令牌,在以后请求服务器的用户数据时无需再次输入账户和密码,而是只需要在请求头上加入token就可以请求数据.
  • 实际上实现的是一段时间的免登陆功能,比如我们登录网易邮箱时勾选的30天免登陆,就是这样实现的.

image.png

2.为什么要使用vuex存储token

  • vuex是实现复杂组件传值的一种方法,

  • vuex能够实现所有组件间的数据共享

  • vuex是父传子props,子传父$emit传输数据之外的实现组件传值的方法

  • 为了使所有组件都能获取到token的数据,我们就可以把token存放在vuex中

image.png

3.如何实现vuex存储token

1.获取token:登录接口

在登录页组件login.vue的dologin方法中:

  • 在发送ajax成功后把res中的token存入vuex中(先提交mutation更新)

image.png

 // 存储token到vuex
            this.$store.commit("updateToken", res.token);
 doLogin() {
      // (1).检查表单时是否校验通过
      this.$refs.formRef.validate(async (valid) => {
        if (valid) {
          // (2).校验通过,发送ajax
          const { data: res } = await this.$axios.post("/api/login", {
            ...this.form,
          });
          // (3).处理数据
          if (res.code === 0) {
            // 跳转登录页
            this.$router.push("/main");
            // 存储token到vuex
            this.$store.commit("updateToken", res.token);
            // 存储用户信息到vuex
            this.$store.dispatch('',...this.form)
            // 弹出信息框
            this.$message.success(res.message);
          } else {
            this.$message.error(res.message);
          }
        }
      });
    },

2.存储token:localStotrage,vuex,

在vuex的store/index.js中写入代码:

  • 为了确保vuex中的state存入localStotrage中,硬盘中
  • 我们引入了state持久化插件
// 导入持久化插件
import creteState from 'vuex-persistedstate'
  • 同时配置持久化存储插件
  //配置持久化存储数据的 vuex 插件
  plugins: [creteState()],
  • 先在state中设一个空的token
  • 在mutation中设立方法,接收token,并同步修改state中的token

image.png

export default new Vuex.Store({
  //配置持久化存储数据的 vuex 插件
  plugins: [creteState()],
  state: {
    token: "",
  },
  getters: {
  },
  mutations: {
    // 更新token
    updateToken(state, token) {
      state.token = token
    },
  },
  actions: {
  },
  modules: {
  }
})

3.使用token:axios拦截器

在main.js中设置axios拦截器

  • 为了避免我们每次请求数据都要手动从vuex中获取token加入请求头
  • 我们就可以 使用axios官方的拦截器,实现每次发送axios请求时,请求拦截器自动在请求头中添加token
config.headers.Authorization = store.state.token
  • 同时我们也可以实现当token过期时,跳转登录页,使用户重新登录
 if (error.response.status === 401) {
    alert('请先登录')
    router.push('/login')
  }
// 添加请求拦截器
axios.interceptors.request.use(function (config) {
  // 在发送请求之前做些什么
  if (store.state.token && config.url.startsWith('/my')) {
    console.log(config);
    config.headers.Authorization = store.state.token
  }
  return config;
}, function (error) {
  // 对请求错误做些什么
  return Promise.reject(error);
});

// 添加响应拦截器
axios.interceptors.response.use(function (response) {
  // 2xx 范围内的状态码都会触发该函数。
  // 对响应数据做点什么
  return response;
}, function (error) {
  // 超出 2xx 范围的状态码都会触发该函数。
  // 对响应错误做点什么
  if (error.response.status === 401) {
    alert('请先登录')
    router.push('/login')
  }
  return Promise.reject(error);
});

4.总结

业务流程:

  • 1.获取token:登录接口

  • 2.存储token:localStotrage,vuex,

  • 3.使用token:axios拦截器

注意:

  • 我们这里使用了持久化存储数据的 vuex 插件
  • 安装:
npm i vuex-persistedstate