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 相关文章推荐
动态调用css文件——jquery的应用
Feb 20 Javascript
js 获取(接收)地址栏参数值的方法
Apr 01 Javascript
利用js正则表达式验证手机号,email地址,邮政编码
Jan 23 Javascript
Javascript玩转继承(三)
May 08 Javascript
详解AngularJS的通信机制
Jun 18 Javascript
AngularJS ng-mousedown 指令
Aug 02 Javascript
探究Vue.js 2.0新增的虚拟DOM
Oct 20 Javascript
WEB 前端开发中防治重复提交的实现方法
Oct 26 Javascript
js调用屏幕宽度的简单方法
Nov 14 Javascript
Vue.directive自定义指令的使用详解
Mar 10 Javascript
解决vue项目刷新后,导航菜单高亮显示的位置不对问题
Nov 01 Javascript
JavaScript实现简易计算器小功能
Oct 22 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
PHP下10件你也许并不了解的事情
2008/09/11 PHP
php继承的一个应用
2011/09/06 PHP
php 团购折扣计算公式
2011/11/24 PHP
php curl 上传文件代码实例
2015/04/27 PHP
Laravel给生产环境添加监听事件(SQL日志监听)
2017/06/19 PHP
PHP获取HTTP body内容的方法
2018/12/31 PHP
一个对于Array的简单扩展
2006/10/03 Javascript
不错的asp中显示新闻的功能
2006/10/13 Javascript
使用js完成节点的增删改复制等的操作
2014/01/02 Javascript
Jquery easyUI 更新行示例
2014/03/06 Javascript
jQuery中DOM树操作之使用反向插入方法实例分析
2015/01/23 Javascript
JavaScript计算两个日期时间段内日期的方法
2015/03/16 Javascript
使用CoffeeScrip优美方式编写javascript代码
2015/10/28 Javascript
基于jquery实现最简单的选项卡切换效果
2016/05/08 Javascript
JavaScript实现通过select标签跳转网页的方法
2016/09/29 Javascript
JS 封装父页面子页面交互接口的实例代码
2019/06/25 Javascript
vue控制多行文字展开收起的实现示例
2019/10/11 Javascript
从源码角度来回答keep-alive组件的缓存原理
2021/01/18 Javascript
python中pycurl库的用法实例
2014/09/30 Python
Python实现Logger打印功能的方法详解
2017/09/01 Python
Python编程之基于概率论的分类方法:朴素贝叶斯
2017/11/11 Python
selenium + python 获取table数据的示例讲解
2018/10/13 Python
Python list列表中删除多个重复元素操作示例
2019/02/27 Python
Python爬虫 bilibili视频弹幕提取过程详解
2019/07/31 Python
Python代码覆盖率统计工具coverage.py用法详解
2020/11/25 Python
Speedo美国:澳大利亚顶尖泳衣制造商
2016/08/03 全球购物
南非最大的在线时尚商店:Zando
2019/07/21 全球购物
介绍下static、final、abstract区别
2015/01/30 面试题
省三好学生申请材料
2014/01/22 职场文书
年度献血先进个人事迹材料
2014/02/14 职场文书
物理教育专业求职信
2014/06/25 职场文书
法定代表人授权委托书范文
2014/08/02 职场文书
法人代表证明书
2014/09/18 职场文书
2015年社区卫生工作总结
2015/04/21 职场文书
MySQL令人咋舌的隐式转换
2021/04/05 MySQL
浅谈Python数学建模之数据导入
2021/06/23 Python