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 相关文章推荐
图片之间的切换
Jun 26 Javascript
JsDom 编程小结
Aug 09 Javascript
JavaScript单元测试ABC
Apr 12 Javascript
js星星评分效果
Jul 24 Javascript
详解基于Bootstrap扁平化的后台框架Ace
Nov 27 Javascript
JS实现日期时间动态显示的方法
Dec 07 Javascript
jQuery图片前后对比插件beforeAfter用法示例【附demo源码下载】
Sep 20 Javascript
浅谈super-vuex使用体验
Jun 25 Javascript
jQuery实现的响应鼠标移动方向插件用法示例【附源码下载】
Aug 28 jQuery
微信小程序实现单列下拉菜单效果
Apr 25 Javascript
Vue记住滚动条和实现下拉加载的完美方法
Jul 31 Javascript
Vue+Vant 图片上传加显示的案例
Nov 03 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
百事可乐也出咖啡了 双倍咖啡因双倍快乐
2021/03/03 咖啡文化
PHP 转义使用详解
2013/07/15 PHP
PHP简单实现“相关文章推荐”功能的方法
2014/07/19 PHP
php使用pdo连接报错Connection failed SQLSTATE的解决方法
2014/12/15 PHP
PHP表单提交后引号前自动加反斜杠的原因及三种办法关闭php魔术引号
2015/09/30 PHP
PHP 设计模式系列之 specification规格模式
2016/01/10 PHP
PHP中FTP相关函数小结
2016/07/15 PHP
PHP实现的敏感词过滤方法示例
2019/03/06 PHP
PHP7 错误处理机制修改
2021/03/09 PHP
ExtJs GridPanel简单的增删改实现代码
2010/08/26 Javascript
JS去除右边逗号的简单方法
2013/07/03 Javascript
jquery中子元素和后代元素的区别示例介绍
2014/04/02 Javascript
jQuery实现复选框批量选择与反选的方法
2015/06/17 Javascript
JavaScript中的this,call,apply使用及区别详解
2016/01/29 Javascript
jQuery自动或手动图片切换效果
2017/10/11 jQuery
Javasript设计模式之链式调用详解
2018/04/26 Javascript
Angularjs实现多图片上传预览功能
2018/07/18 Javascript
js函数柯里化的方法和作用实例分析
2020/04/11 Javascript
Vue微信公众号网页分享的示例代码
2020/05/28 Javascript
[53:03]Optic vs TNC 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
Python Tkinter简单布局实例教程
2014/09/03 Python
python如何生成各种随机分布图
2018/08/27 Python
python用requests实现http请求代码实例
2019/10/31 Python
pandas参数设置的实用小技巧
2020/08/23 Python
python如何控制进程或者线程的个数
2020/10/16 Python
SEPHORA新西兰官方网站:购买化妆品和护肤品
2016/12/02 全球购物
How TDD works
2012/09/30 面试题
获奖的大学生创业计划书
2014/01/05 职场文书
小学三年级学生评语
2014/04/22 职场文书
会计求职信范文
2014/05/24 职场文书
党员干部批评与自我批评反四风思想汇报
2014/09/21 职场文书
个人委托书如何写
2014/09/25 职场文书
2015年前台文员工作总结
2015/05/18 职场文书
2015年中学体育教师工作总结
2015/10/23 职场文书
nginx基于域名,端口,不同IP的虚拟主机设置的实现
2021/03/31 Servers
JavaScript声明变量和数据类型的转换
2022/04/12 Javascript