溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Vue項(xiàng)目中token驗(yàn)證登錄的實(shí)現(xiàn)方法

發(fā)布時(shí)間:2021-08-24 17:17:30 來(lái)源:億速云 閱讀:136 作者:chen 欄目:開發(fā)技術(shù)

本篇內(nèi)容介紹了“Vue項(xiàng)目中token驗(yàn)證登錄的實(shí)現(xiàn)方法”的有關(guān)知識(shí),在實(shí)際案例的操作過程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

1、前言

我是做后端的,前端并不是很懂,看vue這個(gè)框架看了近兩個(gè)禮拜才有點(diǎn)入門的感覺,所以這篇文章寫的可能不怎么好,僅作記錄,有什么不對(duì)或不足的地方歡迎大神指出。

2、問題

做一個(gè)登錄界面,我選擇的是用token進(jìn)行驗(yàn)證登錄,我用的前端框架是Vue.js 和 element-ui,如何在vue 中使用token進(jìn)行驗(yàn)證登錄

3、思考

1、利用token進(jìn)行驗(yàn)證登錄,用戶進(jìn)行登錄操作時(shí),后臺(tái)會(huì)生成一個(gè)token返回給前端,由前端 將這個(gè)token放到請(qǐng)求頭中(這個(gè)是百度的,一般都是放在請(qǐng)求頭),并且此后調(diào)用接口都要把token放到請(qǐng)求的請(qǐng)求頭傳回給后臺(tái)。
2、用戶登錄后,前端需要把token保存下來(lái),后面發(fā)送請(qǐng)求的時(shí)候在拿出來(lái);
3、在發(fā)送每個(gè)請(qǐng)求時(shí)都要把token加到請(qǐng)求頭里,寫一個(gè)全局的攔截器

4、記錄和說明

1、 在src文件夾(我的vue項(xiàng)目是用vue-cli 腳手架創(chuàng)建的)下創(chuàng)建一個(gè)store文件夾,在store中創(chuàng)建一個(gè)index.js

2、src/store/index.js

import Vue form 'vue';
import Vuex from 'vuex';

Vue.use(Vuex);

const store = new Vuex.Store({
 state: {
  token: localStorage.getItem('token') ? localStorage.getItem('token') : ''
 },
 mutotions: {
  setToken (state,token) {
   state.token =token;
   localStorage.setItem("token",token.token);
  },
  delToken (state) {
   state.token = '';
   localStorage.removeItem("token");
  }
 }
})

export default store;

說明:

(1)在寫src/store/index.js 里的內(nèi)容之前,要在你的項(xiàng)目里安裝Vuex ,這里只提供npm的安裝方法,在項(xiàng)目根目錄處打開cmd 輸入下面的命令,后回車

npm install vuex --save

(2) 在這個(gè)store/store/index.js中 這段代碼token.token , 是因?yàn)樵趌ogin.vue中調(diào)用這個(gè)放法傳進(jìn)來(lái)的是一個(gè)對(duì)象(即使你覺的你傳進(jìn)來(lái)的是一個(gè)字符串,不知道為什么會(huì)被放到object里去),傳進(jìn)來(lái)的對(duì)象里有token這個(gè)屬性

localStorage.setItem("token",token.token);

3、src/main.js

// The Vue build version to load with the `import` command
// (runtime-only or standalone) has been set in webpack.base.conf with an alias.
import Vue from 'vue'
import App from './App'
import router from './router'
import ElementUI from 'element-ui'
import 'element-ui/lib/theme-chalk/index.css'
import axios from 'axios'
import promise from 'es6-promise'
import store from './store/index'
promise.polyfill()

Vue.use(ElementUI)
Vue.config.productionTip = false
 

axios.defaults.baseURL= 'http://192.168.80.152:8088'
axios.defaults.headers.post['Content-Type'] = "application/json"
axios.defaults.withCredentials = true
axios.defaults.headers.common['Authorization'] = store.state.token
Vue.prototype.$axios = axios
 

/* eslint-disable no-new */
new Vue({
  el: '#app',
  router,
  store,
  components: { App },
  template: '<App/>'
});

// 添加請(qǐng)求攔截器
axios.interceptors.request.use(config => {
// 在發(fā)送請(qǐng)求之前做些什么
//判斷是否存在token,如果存在將每個(gè)頁(yè)面header都添加token
  if(store.state.token){
    config.headers.common['Authorization']=store.state.token.token
  }

  return config;
}, error => {
// 對(duì)請(qǐng)求錯(cuò)誤做些什么
  return Promise.reject(error);
});

// http response 攔截器
axios.interceptors.response.use(
  response => {

    return response;
  },
  error => {

    if (error.response) {
      switch (error.response.status) {
        case 401:
          this.$store.commit('del_token');
          router.replace({
            path: '/login',
            query: {redirect: router.currentRoute.fullPath}//登錄成功后跳入瀏覽的當(dāng)前頁(yè)面
          })
      }
    }
    return Promise.reject(error.response.data)
  });

說明

(1)這個(gè)是全部的代碼,不一定都和這個(gè)一樣,下面說說用token驗(yàn)證,src/main.js中要配置那些東西
(2)

import store from './store/index'

上面的代碼是將之前寫的src/store/index.js導(dǎo)入到main.js中

new Vue({
  el: '#app',
  router,
  store,
  components: { App },
  template: '<App/>'
});

上述代碼的store是將store掛載到Vue上,后面可以用this.$store 來(lái)獲取store

(3)

// 添加請(qǐng)求攔截器
axios.interceptors.request.use(config => {
// 在發(fā)送請(qǐng)求之前做些什么
//判斷是否存在token,如果存在將每個(gè)頁(yè)面header都添加token
  if(store.state.token){
    config.headers.common['Authorization']=store.state.token.token
  }

  return config;
}, error => {
// 對(duì)請(qǐng)求錯(cuò)誤做些什么
  return Promise.reject(error);
});

// http response 攔截器
axios.interceptors.response.use(
  response => {

    return response;
  },
  error => {

    if (error.response) {
      switch (error.response.status) {
        case 401:
          this.$store.commit('del_token');
          router.replace({
            path: '/login',
            query: {redirect: router.currentRoute.fullPath}//登錄成功后跳入瀏覽的當(dāng)前頁(yè)面
          })
      }
    }
    return Promise.reject(error.response.data)
  });

上述代碼就是請(qǐng)求攔截器,將token放到請(qǐng)求的請(qǐng)求頭中

4、src/router/index.js

router.beforeEach((to, from, next) => {
  if(to.path === '/login') {
    next();
  } else {
    let token = localStorage.getItem('token');
    if(token === 'null' || token === '') {
      next('/login');
    }else {
      next();
    }
  }
});

說明

(1)上述代碼是src/router/index.js 的配置 router 要暴露出來(lái),代碼中有export default

**5、src/components/login/login.vue **

//在這個(gè)組件script標(biāo)簽的export default上面引入一個(gè)東西
 import { mapMutations } from 'vuex';
//這是methods部分
 methods: {

      ...mapMutations(['setToken']),
      login(form){


        let _this = this;
        if(form.phone === "" || form.password === ""){
          _this.$message.error("請(qǐng)輸入手機(jī)號(hào)或密碼");
        }else {
          this.$axios.post(`/user/check/login`,_this.form).then(res => {
            var code = res.data.code;
            var mes = res.data.message;
            if(code === 1){
             /* storage.setItem("token",res.data.data);
              _this.token = res.data.data;*/
             // _this.setToken({Authorization: _this.token})
             // console.log("success");
              _this.$message.success('登錄成功');
              _this.token = res.data.data;
              _this.setToken({token: _this.token});
              _this.$router.push({path:"/home"});

              var storage = window.localStorage;
              //alert(storage.getItem("token"));

              if(this.$store.state.token) {
                this.$router.push('/home');
                console.log(this.$store.state.token.token);
              } else {
                this.$router.replace('/login');
              }

            }else{
              _this.$message.error(mes);
            }
          }).catch(function(err){
            console.log(err);
            _this.$message.error("登錄錯(cuò)誤,請(qǐng)聯(lián)系程序開發(fā)人員?。?quot;);

          })
        }

      }
     }

說明

(1)

let _this = this;

上述代碼是將this放在_this這個(gè)變量中 ,函數(shù)有普通函數(shù):function(){} 和箭頭函數(shù)
普通函數(shù)的this是指當(dāng)前對(duì)象的引用,這里的當(dāng)前對(duì)象是不確定的,箭頭函數(shù)的this是全局的一個(gè)this 代表的對(duì)象是不可變的,任何方式不可以改變他,具體的區(qū)別參見:箭頭函數(shù)和普通函數(shù)的區(qū)別

 _this.setToken({token: _this.token});

上述代碼就是調(diào)用src/store/index.js中的setToken()方法,之所以可以用_this調(diào)用是因?yàn)橹霸趕rc/main.js中將store掛載在vue上了

...mapMutations(['setToken']),

“Vue項(xiàng)目中token驗(yàn)證登錄的實(shí)現(xiàn)方法”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

vue
AI