0
点赞
收藏
分享

微信扫一扫

vue项目token的实现

鱼满舱 2022-04-30 阅读 68

基于vue/cli3.0+脚手架搭建Vue项目(11)


文章目录


前言

在vue项目里,token是用来当作前端和服务器通信的标识。经过登录页面后,每次发起的请求都需要携带上它,给服务器进行认证。


一、vue项目里token的实现步骤

到第四步这里可以有两种实现:

二、代码实现

1.登录页面

( login接口可以看这里https://blog.csdn.net/weixin_43697548/article/details/124355482?spm=1001.2014.3001.5502)

<template>
  <div class="loginPage">
    <div class="content">
      <div class="title">
        <span>账号登录</span>
      </div>
      <div class="input-group">
        <div class="input-row">
          <el-input v-model="username" placeholder="请输入账号/手机号"></el-input>
        </div>
        <div class="input-row">
          <el-input show-password v-model="password" placeholder="请输入密码"></el-input>
        </div>
      </div>
      <div class="btn-row">
        <el-button size="medium" round @click="login">登录</el-button>
      </div>
      <div class="register">注册账号</div>
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      username: '',
      password: '',
    };
  },
  methods: {
    login() {
      if (!this.username || !this.password) {
        return;
      }
      let params = {
        username: this.username,
        password: this.password,
        remember: false,
      };
      this.$api.common.login(params).then(res => {
        let { data, headers } = res;
        if (data.status === 200) {
          // 其他信息...
          // 因为接口返回的headers里已经设置了cookie
          if (headers.cookie) {
            headers.cookie.split(',').forEach(item => {
              let tempVal = item.split('=');
              if (tempVal[0] == 'token') {
                this.cacheCookie('TOKEN', tempVal[1]);
              }
              if (tempVal[0] == 'uuid') {
                this.cacheCookie('UUID', tempVal[1]);
              }
            });
            this.$router.push('/index');
          }
        }
      });
    },
    cacheCookie(type, value) {
      localStorage.setItem(type, value);
      this.$store.commit('OP_' + type, value);
    },
  },
};
</script>

<style lang="scss" scoped>
.loginPage {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 100%;
  height: 100%;
  .content {
    display: flex;
    flex-direction: column;
    width: 280px;
    height: 200px;
    .title {
      flex: 1;
      display: flex;
      align-items: center;
      justify-content: center;
      margin-bottom: 12px;
    }
    .input-group {
      flex: 1;
      display: flex;
      flex-direction: column;
      .input-row {
        margin-bottom: 12px;
      }
    }
    .btn-row {
      flex: 1;
      display: flex;
      justify-content: space-between;
      /deep/ .el-button {
        width: 100%;
      }
    }
    .register {
      margin-top: 4px;
      text-align: right;
    }
  }
}
</style>

2.api请求拦截时添加token信息

// 请求拦截
HTTP.interceptors.request.use(
  config => {
    //设置请求头信息
    let token = localStorage.getItem('token') || '';
    let uuid = localStorage.getItem('uuid') || '';
    const headersOption = {
      token,
      uuid,
    };
    config.headers = Object.assign(config.headers, headersOption);
    return config;
  },
  err => {
    console.log(err);
  },
);

后台在之后的每个接口的过滤器里都会去校验token信息,所以前端可以不需要再校验是否存在或者过期。但是,我们需要在刷新页面时,重新更新store里的token

3.router里更新token和uuid

import store from '@/store/index';
router.beforeEach((to, from, next) => {
  cacheCookie();
  next();
});
function cacheCookie() {
  // 将localStorage里的token信息缓存在vuex
  store.commit('OP_TOKEN', localStorage.getItem('TOKEN'));
  store.commit('OP_UUID', localStorage.getItem('UUID'));
}

tip:附上store代码:

import { OP_TOKEN , OP_UUID } from './mutations-type';

const state = {
  token: '',
  uuid: ''
};
const getters = {
  getToken: state => state.token,
  getUuid: state => state.uuid
};
const mutations = {
  [OP_TOKEN](state, data) {
    state.token =data
  },
  [OP_UUID](state, data) {
    state.uuid =data
  }
};
const action = {};

export default {
  public: {
    state,
    getters,
    mutations,
    action
  }
};

mutations-type.js文件代码

export const OP_TOKEN = 'OP_TOKEN';
export const OP_UUID = 'OP_UUID';

总结

祝你今天愉快

举报

相关推荐

0 条评论