nuxt 自定義 auth 中間件實(shí)現(xiàn)令牌的持久化操作
核心點(diǎn)就是在process.server下,把之前存在 cookie 中的數(shù)據(jù)再用store.commit一下
auth.js
/* eslint-disable no-unused-vars */
/* eslint-disable no-useless-return */
export const TokenKey = 'Admin-token'
/**
* 解析服務(wù)端拿到的cookie
* @param {*} cookie
* @param {*} key
*/
export function getCookie(cookie, key) {
if (!cookie) return
const arrstr = cookie.split('; ')
for (let i = 0; i < arrstr.length; i++) {
const temp = arrstr[i].split('=')
if (temp[0] === key) return unescape(temp[1])
}
}
// 登錄頁(yè)
const loginPath = '/login'
// 首頁(yè)
const indexPath = '/home'
// 路由白名單,直接繞過(guò)路由守衛(wèi)
const whiteList = [loginPath]
/**
* @description 鑒權(quán)中間件,用于校驗(yàn)登陸
*
*/
export default async ({ store, redirect, env, route, req }) => {
const { path, fullPath, query } = route
const { redirect: redirectPath } = query
// 應(yīng)對(duì)刷新 vuex狀態(tài)丟失的解決方案
if (process.server) {
const cookie = req.headers.cookie
const token = getCookie(cookie, TokenKey)
// 設(shè)置登錄狀態(tài)
if (token) {
store.commit('LOGIN', token) //'LOGIN' 和store中的mutations對(duì)應(yīng)起來(lái)就可以了
}
if (token) {
// 已經(jīng)登錄,進(jìn)來(lái)的是登錄頁(yè),且有重定向的路徑,直接調(diào)跳到重定向的路徑
if (path === loginPath && path !== redirectPath) {
redirect(redirectPath)
} else if (path === '/') {
redirect(indexPath)
} else {
// 其他的已經(jīng)登錄過(guò)得直接跳過(guò)
return
}
} else {
// 鑒權(quán)白名單
if (whiteList.includes(path)) return
// 未登錄,進(jìn)來(lái)的不是是登錄頁(yè),全部重定向到登錄頁(yè)
if (!path.includes(loginPath)) {
redirect(`${loginPath}?redirect=${encodeURIComponent(fullPath)}`)
}
}
}
}
補(bǔ)充知識(shí):NUXT 中間件 Middleware
中間件可以使您的自定義的函數(shù)在渲染頁(yè)面之前運(yùn)行
所有的中間件都必須放置在middleware/目錄下。文件名將作為中間件的名稱(chēng)(如:middleware/auth將成為中間件auth)。
中間件收到上下文作為第一個(gè)參數(shù):
export default function (context) {
context.userAgent = context.isServer ? context.req.headers['user-agent'] : navigator.userAgent
}
中間件將按照此順序在序列中執(zhí)行:
1、nuxt.config.js
2、匹配的布局
3、匹配的頁(yè)面
中間件可以是異步的,僅返回一個(gè)Promise或者使用第二個(gè)callback返回值:
middleware/stats.js
import axios from 'axios'
export default function ({ route }) {
return axios.post('http://my-stats-api.com', {
url: route.fullPath
})
}
然后,在nuxt.config.js,布局或者頁(yè)面中,配置middleware參數(shù)
nuxt.config.js
module.exports = {
router: {
middleware: 'stats'
}
}
中間件stats將在每次路由改變時(shí)被調(diào)用。
想了解中間件的例子,請(qǐng)移步example-auth0
以上這篇nuxt 自定義 auth 中間件實(shí)現(xiàn)令牌的持久化操作就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
茶余飯后聊聊Vue3.0響應(yīng)式數(shù)據(jù)那些事兒
這篇文章主要介紹了茶余飯后聊聊Vue3.0響應(yīng)式數(shù)據(jù)那些事兒,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10
Vue中使一個(gè)div鋪滿全屏的實(shí)現(xiàn)
最近在項(xiàng)目開(kāi)發(fā)中,就遇到了這個(gè)問(wèn)題,Vue中如何使一個(gè)div鋪滿全屏,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-07-07
vue中的vue-router?query方式和params方式詳解
這篇文章主要介紹了vue中的vue-router?query方式和params方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-08-08
Vue 實(shí)現(xiàn)樹(shù)形視圖數(shù)據(jù)功能
這篇文章主要介紹了Vue 實(shí)現(xiàn)樹(shù)形視圖數(shù)據(jù)功能,利用簡(jiǎn)單的樹(shù)形視圖實(shí)現(xiàn)的,在實(shí)現(xiàn)過(guò)程中熟悉了組件的遞歸使用,感興趣的朋友跟隨腳本之家小編一起學(xué)習(xí)吧2018-05-05
教你60行代碼實(shí)現(xiàn)一個(gè)迷你響應(yīng)式系統(tǒng)vue
這篇文章主要為大家介紹了教你60行代碼實(shí)現(xiàn)一個(gè)迷你響應(yīng)式系統(tǒng)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪<BR>2023-03-03
Object.assign觸發(fā)watch原理示例解析
這篇文章主要為大家介紹了Object.assign觸發(fā)watch原理示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11

