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 相关文章推荐
Javascript 遍历对象中的子对象
Jul 03 Javascript
js 实现图片预加载(js操作 Image对象属性complete ,事件onload 异步加载图片)
Mar 25 Javascript
jquery实现在页面加载完毕后获取图片高度或宽度
Jun 16 Javascript
Javascript的闭包详解
Dec 26 Javascript
js+html5实现canvas绘制网页时钟的方法
May 21 Javascript
微信小程序 触控事件详细介绍
Oct 17 Javascript
BootStrap下的弹出框加载select2框架失败的解决方法
Aug 31 Javascript
浅谈webpack 构建性能优化策略小结
Jun 13 Javascript
小程序实现搜索框
Jun 19 Javascript
微信小程序wx.navigateTo中events属性实现页面间通信传值,数据同步
Jul 13 Javascript
JavaScript数组类型Array相关的属性与方法详解
Sep 08 Javascript
原生js 实现表单验证功能
Feb 08 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实现维护文件代码
2007/06/14 PHP
php数组去重的函数代码
2013/02/03 PHP
PHP设置一边执行一边输出结果的代码
2013/09/30 PHP
thinkphp的URL路由规则与配置实例
2014/11/26 PHP
适用于初学者的简易PHP文件上传类
2015/10/29 PHP
PHP闭包定义与使用简单示例
2018/04/13 PHP
非常漂亮的JS代码经典广告
2007/10/21 Javascript
JavaScript入门教程(5) js Screen屏幕对象
2009/01/31 Javascript
jQuery实现的无限级下拉菜单功能示例
2016/09/12 Javascript
JavaScript 是什么意思
2016/09/22 Javascript
JavaScript给每一个li节点绑定点击事件的实现方法
2016/12/01 Javascript
vue-resource 拦截器(interceptor)的使用详解
2017/07/04 Javascript
JavaScript中一些特殊的字符运算
2017/08/17 Javascript
JavaScript模拟实现封装的三种方式及写法区别
2017/10/27 Javascript
Vue中的异步组件函数实现代码
2018/07/20 Javascript
JS判断字符串是否为整数的方法--简单的正则判断
2018/07/23 Javascript
微信小程序实现即时通信聊天功能的实例代码
2018/08/17 Javascript
Js代码中的span拼接问题解决
2019/11/22 Javascript
vue使用screenfull插件实现全屏功能
2020/09/17 Javascript
python修改注册表终止360进程实例
2014/10/13 Python
Python实现模拟登录及表单提交的方法
2015/07/25 Python
python3中bytes和string之间的互相转换
2017/02/09 Python
利用python对Excel中的特定数据提取并写入新表的方法
2018/06/14 Python
Python常见MongoDB数据库操作实例总结
2018/07/24 Python
python twilio模块实现发送手机短信功能
2019/08/02 Python
python实现PCA降维的示例详解
2020/02/24 Python
Python页面加载的等待方式总结
2021/02/28 Python
利用纯CSS3实现文字向右循环闪过效果实例(可用于移动端)
2017/06/15 HTML / CSS
HTML5有哪些新特征
2015/12/01 HTML / CSS
马德里著名的运动鞋商店:NOIRFONCE
2019/04/12 全球购物
小学优秀班集体申报材料
2014/05/25 职场文书
学校学习雷锋活动总结
2014/07/03 职场文书
创新社会管理心得体会
2014/09/12 职场文书
文明礼仪倡议书
2015/04/28 职场文书
入党函调证明材料
2015/06/19 职场文书
Python词云的正确实现方法实例
2021/05/08 Python