vue項目實現用戶登陸 以及攜帶token

調取登陸接口 (首先明確一下要作到事情)前端

在先後端徹底分離的狀況下,Vue項目中實現token驗證大體思路以下:vue

  1. 第一次登陸的時候,前端調後端的登錄接口,發送用戶名和密碼
  2. 後端收到請求,驗證用戶名和密碼,驗證成功,就給前端返回一個token
  3. 前端拿到token,將token存儲到localStorage和vuex中,並跳轉路由頁面
  4. 前端每次跳轉路由,就判斷 localStroage 中有無 token ,沒有就跳轉到登陸頁面,有則跳轉到對應路由頁面
  5. 每次調後端接口,都要在請求頭中加token
  6. 後端判斷請求頭中有無token,有token,就拿到token並驗證token,驗證成功就返回數據,驗證失敗(例如:token過時)就返回401,請求頭中沒有token也返回401
  7. 若是前端拿到狀態碼爲401,就清除token信息並跳轉到登陸頁面
  8. 調取登陸接口成功,會在回調函數中將token存儲到localStorage和vuex中


1、前期準備

頁面模板ios

<template>  <div>    <input type="text" v-model="loginForm.username" placeholder="用戶名"/>    <input type="text" v-model="loginForm.password" placeholder="密碼"/>    <button @click="login">登陸</button>  </div></template>複製代碼

邏輯實現vue-router

export default {  data () {    return {      loginForm: {        username: '',        password: ''      }    };  },  methods: {    ...mapMutations(['changeLogin']),    login () {      let _this =this;                     /////判讀帳號密碼是否輸入,沒有則alert 出來      if(this.loginForm.username === '' ||this.loginForm.password === '') {                     alert('帳號或密碼不能爲空');      } else {        this.axios({          method: 'post',          url: '/user/login',          data: _this.loginForm        }).then(res => {          console.log(res.data);          _this.userToken = 'Bearer ' + res.data.data.body.token;          // 將用戶token保存到vuex中          _this.changeLogin({ Authorization: _this.userToken });          _this.$router.push('/home');          alert('登錄成功');        }).catch(error => {          alert('帳號或密碼錯誤');          console.log(error);        });      }    }  }};複製代碼


3.在store文件夾下的index.js 添加 token
vuex

import Vue from 'vue';import Vuex from 'vuex';Vue.use(Vuex);const store = new Vuex.Store({  state: {    // 存儲token    Authorization: localStorage.getItem('Authorization') ? localStorage.getItem('Authorization') : ''  },  mutations: {    // 修改token,並將token存入localStorage    changeLogin (state, user) {      state.Authorization = user.Authorization;      localStorage.setItem('Authorization', user.Authorization);    }  }});export default store;複製代碼


二,配置 路由導航守衛

router文件夾下的index.js
axios

import Vue from 'vue';import Router from 'vue-router';import login from '@/components/login';import home from '@/components/home';Vue.use(Router);const router = new Router({  routes: [    {      path: '/',      redirect: '/login'    },    {      path: '/login',      name: 'login',      component: login    },    {      path: '/home',      name: 'home',      component: home    }  ]});// 導航守衛// 使用 router.beforeEach 註冊一個全局前置守衛,判斷用戶是否登錄router.beforeEach((to, from, next) => {  if (to.path === '/login') {    next();  } else {    let token = localStorage.getItem('Authorization');    if (token === 'null' || token === '') {      next('/login');    } else {      next();    }  }});export default router;複製代碼

3、請求頭加token 在 main.js中添加

// 添加請求攔截器,在請求頭中加tokenaxios.interceptors.request.use(  config => {    if (localStorage.getItem('Authorization')) {      config.headers.Authorization = localStorage.getItem('Authorization');    }    return config;  },  error => {    return Promise.reject(error);  });複製代碼

token的過時能夠自定義
後端

4、若是前端拿到狀態碼爲401,就清除token信息並跳轉到登陸頁面

localStorage.removeItem('Authorization'); this.$router.push('/login');複製代碼
相關文章
相關標籤/搜索