隨著前后端分離的不斷普及,前端中也會經常需要進行用戶認證處理。而在Vue應用中,由于其單頁應用的特性,需要使用到token來區分用戶的登錄狀態。
在Vue應用中,一般我們會把token存在localStorage中,然后在每次需要發送請求時,將其添加到請求header中。這樣服務器就可以通過token來判斷用戶是否具有相應的權限了。
一般在Vue項目中,使用axios庫進行網絡請求。下面是使用axios時如何添加token:
axios.defaults.headers.common['Authorization'] = 'Bearer ' + token;
上述代碼就是在axios的http頭中添加Authorization屬性,它的值是由字符串'Bearer '和token拼接而成的。其中'Bearer '后面有個空格,這是因為這個空格表示這是Bearer token(也就是常說的授權Token)。
但是這種方式有一個明顯的問題,就是如果頁面刷新,則localStorage中保存的token就會丟失,導致用戶需要重新登錄。解決這個問題的方法是使用Vue插件vuex來保存token。
下面是使用vuex保存token時的代碼實現:
//store.js import Vue from 'vue' import Vuex from 'vuex' Vue.use(Vuex) const store = new Vuex.Store({ state: { token: '' }, mutations: { setToken (state, token) { state.token = token localStorage.setItem('token', token) }, removeToken (state) { state.token = '' localStorage.removeItem('token') } }, actions: {}, modules: {} }) export default store
上述代碼中,store是一個Vue的插件,它用于保存應用的狀態。vuex中的state用于保存全局狀態,mutations用于修改state。在setToken時會將token設置到state中,并且把token存儲到localStorage中。在removeToken中,會將state中的token清除掉,并且從localStorage中移除token。
既然已經用vuex保存了token,那么如何在axios中使用這個vuex呢?可以通過axios的攔截器來實現:
//api.js import axios from 'axios' import store from '@/store/store' axios.interceptors.request.use( config =>{ if (store.state.token) { config.headers.Authorization = `Bearer ${store.state.token}` } return config }, error =>{ return Promise.reject(error) }) export default { ... }
在上述代碼中,攔截器會檢查vuex store中是否保存了token,如果有的話就添加Authorization屬性到http頭中。
至此,我們已經能夠優雅地處理token問題。對于使用vue開發的應用而言,這是非常必要的,因為它可以保證用戶的登錄態在整個單頁面應用的生命周期中一直有效。