1. 程式人生 > >Vue處理token以及請求攔截和響應攔截,全域性守衛

Vue處理token以及請求攔截和響應攔截,全域性守衛

token一種身份的驗證,在大多數網站中,登入的時候都會攜帶token,去訪問其他頁面,token就想當於一種令牌。可以判斷使用者是否登入狀態。本次頁面是通過Element-ui搭建的登入介面

當用戶登入的時候,向後端發起請求的時候,後端會返回給我一個token,前端可以進行校驗,進行處理token

當前端拿到後端返回的token,可以通過localStorage儲存到本地,然後通過jwt-decode對token進行解析,jwt-decode是一種對token的解析包,通過npm install jwt-decode

設定好儲存方式後,當用戶再次登入的時候,在瀏覽器段可以看點使用者儲存的token。

當頁面很多地方需要用到token的時候,使用者必須攜帶token才能訪問其他頁面,可以通過請求攔截和響應攔截設定,並且在響應攔截的時候處理token是否過時,過期時間是通過後端設定的,前端需要判斷token的狀態碼是否過時就行

import axios from 'axios'
import { Loading ,Message} from 'element-ui'  //引入了element-ui框架庫
import router from './router/index.js'
let loading;

function startLoading() {
	loading =Loading.service({
		lock: true,
        text: '載入中...',
        background: 'rgba(0, 0, 0, 0.7)'
	});
}

function endLoading() {
	loading.close()
}

// 請求攔截

axios.interceptors.request.use(config => {

    startLoading()
    //設定請求頭
    if(localStorage.eleToken) {
    	config.headers.Authorization = localStorage.eleToken
    }

    return config
  }, error => {
    return Promise.reject(error)
  })


// 響應攔截
axios.interceptors.response.use(response => {
    endLoading()
    return response
}, error => {
	Message.error(error.response.data)
	endLoading();

	//獲取狀態碼
	const {status} = error.response;

	if(status === 401) {
		Message.error("token失效,請重新登入");
		//清除token
		localStorage.removeItem('eleToken');
		//重新登入
		router.push('/login')
	}

    return Promise.reject(error)
})

export default axios;

儲存vuex

如果頁面過多,不想資料來回傳遞,這時候就可以用到vuex來儲存資料了,這樣每個頁面都可以通過store獲取使用者資訊了。當用戶拿到token令牌的時候,會得到使用者的資訊,

import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)

const type = {
	SET_AUTHORIZATION:"set_authorization",
	SET_USER:"set_user"
}

const state = {
	isAuthorization:false,
	user:{}
}

const getters = {  //獲取state狀態
 isAuthorization: state => state.isAuthorization,
 user: user => state.user
}

const mutations= {
	[type.SET_AUTHORIZATION](state,isAuthorization){
		if(isAuthorization){
			state.isAuthorization = isAuthorization
		} else {
			isAuthorization = false
		}
	},
	
	[type.SET_USER](state,user) {
		if(user) {
			state.user = user
		} else {
			user={}
		}
	}
}
const actions = {
	setAuthorization:({commit},isAuthorization) => {
		commit(type.SET_AUTHORIZATION,isAuthorization)
	},
	setsuer:({commit},user) => {
		commit(type.SET_USER,user)
	}
}

export const store = new Vuex.Store({
	state,
	getters,
	mutations,
	actions
})

  通過以上vuex設定,我們可以吧得到的token和使用者的一些資訊儲存到vuex中,方便其他頁面進行呼叫

submitForm(formName) {
      this.$refs[formName].validate((valid) => {
        if (valid) {
          this.$axios.post('/api/users/login',this.loginUser).then(res => {
            
            const {token} = res.data;
            //儲存token
            localStorage.setItem('eleToken',token)
            //解析token
            const decode = jwt_decode(token)
            console.log(res)
             // 儲存到vuex
            this.$store.dispatch("setAuthorization", !this.isEmpty(decode));
            this.$store.dispatch("setsuer",decode)

            // this.$router.push('/index')
          })
        }
      })
    },//封裝的驗證方法
    isEmpty(value) {
      return (
        value === undefined ||
        value === null ||
        (typeof value === "object" && Object.keys(value).length === 0) ||
        (typeof value === "string" && value.trim().length === 0)
      );
    }

 雖然token和使用者資訊儲存到vuex中了,當我們重新整理瀏覽器的時候,儲存的vuex資料都沒有了,

  

這時候。我們需要在跟元件app.vue元件進行判斷,token是否存在本地,存在就存放到vuex中

export default {
  name: 'App',
  created(){
    if(localStorage.setItem) {
      const decode = jwt_decode(localStorage.eleToken)

      // 儲存到vuex
      this.$store.dispatch("setAuthorization", !this.isEmpty(decode));
      this.$store.dispatch("setsuer",decode)
    }
  },
  methods:{
    isEmpty(value) {
      return (
        value === undefined ||
        value === null ||
        (typeof value === "object" && Object.keys(value).length === 0) ||
        (typeof value === "string" && value.trim().length === 0)
      );
    }
  }
}

 路由守衛

路由跳轉前做一些驗證,比如登入驗證,購物車,是網站中的普遍需求,在使用者沒有登入的狀態下,是無法訪問其他頁面的,這是時候我們就可以通過beforeEach來判斷使用者是否登入,(原理不需要細講,官方文件有,直接上程式碼),還是直接通過token去驗證是否登入或者沒有登入狀態

router.beforeEach((to,from,next) => {
  const isLogin = localStorage.eleToken ? true : false
  if(to.path === '/login' || to.path === 'register') {
    next()
  } else {
    isLogin ? next() : next('/login')
  }
})

 以上都是這次部落格中所有的內容,如果喜歡,可以關注一下!!!