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实现的元素的left增加N像素 鼠标移开会慢慢的移动到原来的位置
Mar 21 Javascript
JS循环遍历JSON数据的方法
Jul 08 Javascript
jQuery代码性能优化的10种方法
Jun 21 Javascript
Javascript闭包与函数柯里化浅析
Jun 22 Javascript
js轮盘抽奖实例分析
Apr 17 Javascript
AngularJS ng-repeat数组有重复值的解决方法
Oct 23 Javascript
jQuery实现可编辑表格并生成json结果(实例代码)
Jul 19 jQuery
jQuery获取复选框选中的当前行的某个字段的值
Sep 15 jQuery
javascript-hashchange事件和历史状态管理实例分析
Apr 18 Javascript
详解vue高级特性
Jun 09 Javascript
vue实现给div绑定keyup的enter事件
Jul 31 Javascript
简介JavaScript错误处理机制
Aug 04 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
模仿OSO的论坛(二)
2006/10/09 PHP
常见的PHP五种设计模式小结
2011/03/23 PHP
解决PHP4.0 和 PHP5.0类构造函数的兼容问题
2013/08/01 PHP
php分页函数示例代码分享
2014/02/24 PHP
php通过rmdir删除目录的简单用法
2015/03/18 PHP
100多行PHP代码实现socks5代理服务器[2]
2016/05/05 PHP
PHP is_array() 检测变量是否是数组的实现方法
2016/06/13 PHP
php版微信公众号接口实现发红包的方法
2016/10/14 PHP
js对象内部访问this修饰的成员函数示例
2014/04/27 Javascript
jquery动态添加元素事件失效问题解决方法
2014/05/23 Javascript
jquery+css实现的红色线条横向二级菜单效果
2015/08/22 Javascript
JavaScript截屏功能的实现代码
2017/07/28 Javascript
使用webpack搭建react开发环境的方法
2018/05/15 Javascript
antd Upload 文件上传的示例代码
2018/12/14 Javascript
vue-router 前端路由之路由传值的方式详解
2019/04/30 Javascript
vue使用prop可以渲染但是打印台报错的解决方式
2019/11/13 Javascript
VUE实时监听元素距离顶部高度的操作
2020/07/29 Javascript
vue路由结构可设一层方便动态添加路由操作
2020/08/31 Javascript
Python常用小技巧总结
2015/06/01 Python
浅谈python新手中常见的疑惑及解答
2016/06/14 Python
Python 文件操作的详解及实例
2017/09/18 Python
Python温度转换实例分析
2018/01/17 Python
python 查找文件名包含指定字符串的方法
2018/06/05 Python
Python中按值来获取指定的键
2019/03/04 Python
python中pygame安装过程(超级详细)
2019/08/04 Python
pycharm配置git(图文教程)
2019/08/16 Python
利用Python绘制Jazz网络图的例子
2019/11/21 Python
opencv 查找连通区域 最大面积实例
2020/06/04 Python
Python库安装速度过慢解决方案
2020/07/14 Python
详解python模块pychartdir安装及导入问题
2020/10/22 Python
英国最受欢迎的手表网站:Watch Shop
2016/10/21 全球购物
BrandAlley英国:法国折扣奢侈品网上零售商
2017/07/03 全球购物
复核员上岗演讲稿
2014/01/05 职场文书
责任担保书范文
2014/05/21 职场文书
青年干部培训班学习心得体会
2016/01/06 职场文书
2016年世界艾滋病日宣传活动总结
2016/04/01 职场文书