Vue中設置登錄驗證攔截功能的思路詳解
Hello,你好呀,我是灰小猿
,一個超會寫bug的程序猿!
今天在做vue和springboot交互的一個項目的時候,想要基於前端實現一些隻有登錄驗證之後才能訪問某些頁面的操作,所以在這裡總結一下實現該功能的一個解決方案,
首先說一下我是如何判斷是否已經登錄的,
一、解決思路
由於在我的springboot後臺采用的shiro+Jwt安全框架,所以會在登錄之後反饋給前端一個token
,並且前端會將該token進行存儲,所以我是去查找瀏覽器中是否存在token,如果瀏覽器中存在token,則說明登錄成功,可以訪問相關頁面;
如果沒有token則說明沒有登錄,j就跳轉到登錄頁面。為瞭簡化操作,我將這個驗證的過程進行瞭封裝。
註意:
使用這種方法進行驗證的前提是你的前後端是通過shiro和token進行驗證的,並且前端會存儲服務器返回的token。
二、讓瀏覽器存儲服務器返回的token
首先來看一下服務器端返回的token是如何被我在前端頁面中存儲的。
首先我在store文件下的index.js文件中封裝瞭一個SET_TOKEN方法,用來將token存儲到瀏覽器,這樣我們每次就都可以通過localStorage.getItem(“token”),來從本地拿到我們的token,同時封裝瞭一個REMOVE_INFO方法,在當我們退出登錄的時候,清空瀏覽器中的token信息。
store文件下的index.js中代碼如下:
import Vue from 'vue' import Vuex from 'vuex' Vue.use(Vuex) export default new Vuex.Store({ state: { // token: "", //用戶的信息可以直接從瀏覽器中取出來 token: localStorage.getItem("token"), //反序列化操作 userInfo: JSON.parse(sessionStorage.getItem("userInfo")) }, mutations: { /**類似set操作*/ //給token賦值 SET_TOKEN: (state, token) => { state.token = token; //將信息存儲到瀏覽器中,以至於瀏覽器關閉時信息還在 localStorage.setItem("token", token); }, //給userinfo賦值 SET_USERINFO: (state, userInfo) => { state.userInfo = userInfo; //session會在每次瀏覽器關閉時清空,在重新登錄後再生成 //由於sessionStorage不能存儲對象,所以要將其存儲成字符串的形式 sessionStorage.setItem("userInfo", JSON.stringify(userInfo)); }, //移除用戶信息 REMOVE_INFO: (state) => { //移除用戶信息時將用戶所有的信息都置為空 state.token = ""; state.userInfo = {}; localStorage.setItem("token", ""); sessionStorage.setItem("userInfo", JSON.stringify("")); } }, getters: { /**類似get請求*/ //獲取用戶信息 getUser: state => { return state.userInfo; } }, actions: {}, modules: {} })
三、在請求中設置訪問權限
由於我們並不是所有的頁面都隻要在登錄的時候才能訪問,所以我們要對需要進行登錄才能訪問的頁面設置訪問權限,
在vue中我們一般將訪問路由設置在router下的index.js文件中,對於需要添登錄權限的請求路由,我們可以給其增加meta屬性,在其中設置一個Boolean類型的屬性requireAuth, 我們會以該屬性是否為true來判斷是否需要驗證登錄。
比如我們的BlogEdit頁面隻有在登錄的時候才能訪問,Login頁面不需要登權限,那麼我們就可以這樣設置:(代碼有刪減,但是保留瞭核心部分,隻是刪除瞭部分路由。)
/** * 路由註冊中心 */ import Vue from 'vue' import VueRouter from 'vue-router' //註冊頁面 import Login from '../views/Login.vue' import BlogEdit from '../views/BlogEdit.vue' Vue.use(VueRouter) const routes = [ { path: '/login', name: 'Login', component: Login }, { path: '/blog/add', name: 'BlogAdd', component: BlogEdit, //添加權限訪問,表示隻有登錄之後才能進行該操作 meta: { requireAuth: true } }, ] const router = new VueRouter({ mode: 'history', base: process.env.BASE_URL, routes }) export default router
這樣在每次請求BlogEdit頁面的時候都會進行判斷。
四、封裝登錄驗證
現在我們需要寫一個方法來對我們剛才設置的屬性進行驗證。所以在src目錄下新建一個permission.js文件,在其中進行封裝。
思路是這樣的:
首先我們攔截該請求,獲取到該請求中的requireAuth參數,如果參數是true,那麼就去獲取瀏覽器中的token,驗證當前是否是登錄狀態。如果存在token,就放行請求;如果沒有獲取到token,就跳轉到登錄頁面。
註意:
如果你是基於其他驗證登錄的,可以將
//獲取到本地的token
const token =ocalStorage.getItem(“token”)
換成你的驗證方式,但是思路都是一樣的。
代碼如下:
/** * 請求登錄驗證,如果沒有登錄,不能訪問頁面,返回到登錄頁面 */ import router from "./router"; //路由判斷登錄,根據路由配置文件的參數 router.beforeEach((to,from,next)=>{ //判斷該路由是否需要登錄權限 //record.meta.requireAuth是獲取到該請求中攜帶的該參數 if (to.matched.some(record => record.meta.requireAuth)){ //獲取到本地的token const token = localStorage.getItem("token") console.log("顯示token----------:" + token) //判斷當前的token是否存在,也就是登錄時的token if (token){ //如果指向的是登錄頁面,不做任何操作 if (to.path === "/login"){ }else { //如果不是登錄頁面,且token存在,就放行 next() } }else { // 如果token不存在 // 前往登錄 next({path:'/login'}) } }else { //如果不需要登錄認證,就直接訪問 next() } })
最後別忘瞭將該頁面引入到mian.js中。
//導入permission.js,用戶進行前端的權限控制 import "./permission"
總結一下
主要的操作就是第三步和第四步,隻要你在請求路由中設置瞭登錄驗證的參數,同時第四步寫入瞭登錄攔截驗證,並且引入到的main.js文件中,就可以瞭!
至此通過前端驗證登錄攔截完成。
到此這篇關於Vue中設置登錄驗證攔截功能的思路詳解的文章就介紹到這瞭,更多相關vue登錄驗證攔截內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- Vue保持用戶登錄狀態(各種token存儲方式)
- Vue項目如何保持用戶登錄狀態(localStorage+vuex刷新頁面後狀態依然保持)
- vue獲取token實現token登錄的示例代碼
- 詳解如何使用Vuex實現Vue後臺管理中的角色鑒權
- vue一步到位的實現動態路由