nuxt 自定义 auth 中间件实现令牌的持久化操作


Posted in Javascript onNovember 05, 2020

核心点就是在process.server下,把之前存在 cookie 中的数据再用store.commit一下

auth.js

/* eslint-disable no-unused-vars */
/* eslint-disable no-useless-return */

export const TokenKey = 'Admin-token'

/**
 * 解析服务端拿到的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])
 }
}

// 登录页
const loginPath = '/login'
// 首页
const indexPath = '/home'
// 路由白名单,直接绕过路由守卫
const whiteList = [loginPath]

/**
 * @description 鉴权中间件,用于校验登陆
 *
 */
export default async ({ store, redirect, env, route, req }) => {
 const { path, fullPath, query } = route
 const { redirect: redirectPath } = query

 // 应对刷新 vuex状态丢失的解决方案
 if (process.server) {
 const cookie = req.headers.cookie
 const token = getCookie(cookie, TokenKey)

 // 设置登录状态
 if (token) {
  store.commit('LOGIN', token) //'LOGIN' 和store中的mutations对应起来就可以了
 }

 if (token) {
  // 已经登录,进来的是登录页,且有重定向的路径,直接调跳到重定向的路径
  if (path === loginPath && path !== redirectPath) {
  redirect(redirectPath)
  } else if (path === '/') {
  redirect(indexPath)
  } else {
  // 其他的已经登录过得直接跳过
  return
  }
 } else {
  // 鉴权白名单
  if (whiteList.includes(path)) return

  // 未登录,进来的不是是登录页,全部重定向到登录页
  if (!path.includes(loginPath)) {
  redirect(`${loginPath}?redirect=${encodeURIComponent(fullPath)}`)
  }
 }
 }
}

补充知识:NUXT 中间件 Middleware

中间件可以使您的自定义的函数在渲染页面之前运行

所有的中间件都必须放置在middleware/目录下。文件名将作为中间件的名称(如:middleware/auth将成为中间件auth)。

中间件收到上下文作为第一个参数:

export default function (context) {
 context.userAgent = context.isServer ? context.req.headers['user-agent'] : navigator.userAgent
}

中间件将按照此顺序在序列中执行:

1、nuxt.config.js

2、匹配的布局

3、匹配的页面

中间件可以是异步的,仅返回一个Promise或者使用第二个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,布局或者页面中,配置middleware参数

nuxt.config.js

module.exports = {
 router: {
 middleware: 'stats'
 } 
}

中间件stats将在每次路由改变时被调用。

想了解中间件的例子,请移步example-auth0

以上这篇nuxt 自定义 auth 中间件实现令牌的持久化操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jQuery 常见学习网站与参考书
Nov 09 Javascript
JavaScript 判断指定字符串是否为有效数字
May 11 Javascript
JS实现网页表格自动变大缩小的方法
Mar 09 Javascript
jQuery实现在列表的首行添加数据
May 19 Javascript
js实现点击链接后延迟3秒再跳转的方法
Jun 05 Javascript
jQuery 中的 DOM 操作
Apr 26 Javascript
基于JavaScript实现在新的tab页打开url
Aug 04 Javascript
js数组去重的hash方法
Dec 22 Javascript
vue实现图书管理demo详解
Oct 17 Javascript
Angular实现的日程表功能【可添加及隐藏显示内容】
Dec 27 Javascript
浅谈webpack 自动刷新与解析
Apr 09 Javascript
nuxt.js写项目时增加错误提示页面操作
Nov 05 Javascript
Vant 在vue-cli 4.x中按需加载操作
Nov 05 #Javascript
前端vue如何使用高德地图
Nov 05 #Javascript
解决vue项目中遇到 Cannot find module ‘chalk‘ 报错的问题
Nov 05 #Javascript
vue 全局封装loading加载教程(全局监听)
Nov 05 #Javascript
vant组件中 dialog的确认按钮的回调事件操作
Nov 04 #Javascript
Array.filter中如何正确使用Async
Nov 04 #Javascript
JavaScript setTimeout()基本用法有哪些
Nov 04 #Javascript
You might like
php5.4以下版本json不支持不转义内容中文的解决方法
2015/01/13 PHP
详解PHP中websocket的使用方法
2016/09/15 PHP
PHP那些琐碎的知识点(整理)
2017/05/20 PHP
PHP文件上传小程序 适合初学者学习!
2019/05/23 PHP
Laravel 之url参数,获取路由参数的例子
2019/10/21 PHP
基于jquery完美拖拽,可返回拖动轨迹
2012/03/29 Javascript
javascript+html5实现绘制圆环的方法
2015/07/28 Javascript
js弹出对话框方式小结
2015/11/17 Javascript
js点击按钮实现带遮罩层的弹出视频效果
2015/12/19 Javascript
jQuery动画效果实现图片无缝连续滚动
2016/01/12 Javascript
纯JS实现轮播图
2017/02/22 Javascript
vue 2.0路由之路由嵌套示例详解
2017/05/08 Javascript
使用jquery的jsonp如何发起跨域请求及其原理详解
2017/08/17 jQuery
浅谈Webpack自动化构建实践指南
2017/12/18 Javascript
Vue分页效果与购物车功能
2019/12/13 Javascript
简单学习Python多进程Multiprocessing
2017/08/29 Python
Python迭代器与生成器用法实例分析
2018/07/09 Python
用Python解决x的n次方问题
2019/02/08 Python
详解Python中pandas的安装操作说明(傻瓜版)
2019/04/08 Python
Python:Numpy 求平均向量的实例
2019/06/29 Python
Python在Matplotlib图中显示中文字体的操作方法
2019/07/29 Python
Python 元组操作总结
2019/09/18 Python
自适应线性神经网络Adaline的python实现详解
2019/09/30 Python
python pygame实现球球大作战
2019/11/25 Python
python GUI库图形界面开发之PyQt5美化窗体与控件(异形窗体)实例
2020/02/25 Python
为什么是 Python -m
2020/06/19 Python
python 5个顶级异步框架推荐
2020/09/09 Python
Python爬虫之App爬虫视频下载的实现
2020/12/08 Python
Python关于拓扑排序知识点讲解
2021/01/04 Python
Python用requests库爬取返回为空的解决办法
2021/02/21 Python
html5 迷宫游戏(碰撞检测)实例一
2013/07/25 HTML / CSS
婚纱摄影师求职信范文
2014/04/17 职场文书
关于青春的演讲稿
2014/05/05 职场文书
2015年社区教育工作总结
2015/05/13 职场文书
经费申请报告范文
2015/05/18 职场文书
Arthas排查Kubernetes中应用频繁挂掉重启异常
2022/02/28 MySQL