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 相关文章推荐
asp javascript 实现关闭窗口时保存数据的办法
Nov 24 Javascript
JAVASCRIPT下判断IE与FF的比较简单的方式
Oct 17 Javascript
js判断手机号运营商的方法
Oct 23 Javascript
js图片轮播手动切换效果
Nov 10 Javascript
JavaScript严格模式详解
Nov 18 Javascript
jQuery soColorPacker 网页拾色器
Jun 22 Javascript
详解用vue-cli来搭建vue项目和webpack
Apr 20 Javascript
JS实现无缝循环marquee滚动效果
May 22 Javascript
Vue中对比scoped css和css module的区别
May 17 Javascript
Vue2(三)实现子菜单展开收缩,带动画效果实现方法
Apr 28 Javascript
JS实现随机点名器
Apr 12 Javascript
Vue 自适应高度表格的实现方法
May 13 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 操作文件的一些FAQ总结
2009/02/12 PHP
yii框架builder、update、delete使用方法
2014/04/30 PHP
kindeditor 加入七牛云上传的实例讲解
2017/11/12 PHP
PHP实现的mongoDB数据库操作类完整实例
2018/04/10 PHP
PHP中实现中文字串截取无乱码的解决方法
2018/05/29 PHP
JS在TextArea光标位置插入文字并实现移动光标到文字末尾
2013/06/21 Javascript
jquery鼠标停止移动事件
2013/12/21 Javascript
javascript中的undefined和not defined区别示例介绍
2014/02/26 Javascript
JavaScript中的分号插入机制详细介绍
2015/02/11 Javascript
AngularJS使用ngOption实现下拉列表的实例代码
2016/01/23 Javascript
Bootstrap实现水平排列的表单
2016/07/04 Javascript
Vuex之理解Getters的用法实例
2017/04/19 Javascript
详解cordova打包成webapp的方法
2017/10/18 Javascript
原生JavaScript实现Ajax异步请求
2017/11/19 Javascript
jQuery+CSS实现的table表格行列转置功能示例
2018/01/08 jQuery
Vue 与 Vuex 的第一次接触遇到的坑
2018/08/16 Javascript
jquery.pager.js实现分页效果
2019/07/29 jQuery
解决layui的table插件无法多层级获取json数据的问题
2019/09/19 Javascript
vue swipeCell滑动单元格(仿微信)的实现示例
2020/09/14 Javascript
[44:58]2018DOTA2亚洲邀请赛 4.5 淘汰赛 LGD vs Liquid 第二场
2018/04/06 DOTA
[46:28]EG vs Liquid 2019国际邀请赛淘汰赛 败者组 BO3 第二场 8.23
2019/09/05 DOTA
Python编程之微信推送模板消息功能示例
2017/08/21 Python
Windows系统下多版本pip的共存问题详解
2017/10/10 Python
Queue 实现生产者消费者模型(实例讲解)
2017/11/13 Python
一道python走迷宫算法题
2018/01/22 Python
Python 实现训练集、测试集随机划分
2020/01/08 Python
Jupyter notebook快速入门教程(推荐)
2020/05/18 Python
简单介绍一下pyinstaller打包以及安全性的实现
2020/06/02 Python
Python 实现 T00ls 自动签到脚本代码(邮件+钉钉通知)
2020/07/06 Python
Python 的 __str__ 和 __repr__ 方法对比
2020/09/02 Python
Scrapy-Redis之RedisSpider与RedisCrawlSpider详解
2020/11/18 Python
css3实现文字扫光渐变动画效果的示例
2017/11/07 HTML / CSS
世界最大域名注册商:GoDaddy
2016/07/24 全球购物
椰子猫砂:CatSpot
2018/08/27 全球购物
考核评语大全
2014/04/29 职场文书
关于MySQL中explain工具的使用
2023/05/08 MySQL