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 相关文章推荐
Prototype RegExp对象 学习
Jul 19 Javascript
来自国外的页面JavaScript文件优化
Dec 08 Javascript
读jQuery之十三 添加事件和删除事件的核心方法
Aug 23 Javascript
jQuery.Validate验证库的使用介绍
Apr 26 Javascript
js获取系统的根路径实现介绍
Sep 08 Javascript
加载列表时jquery获取ul中第一个li的属性
Nov 02 Javascript
react router 4.0以上的路由应用详解
Sep 21 Javascript
vue input 输入校验字母数字组合且长度小于30的实现代码
May 16 Javascript
微信小程序实现手指触摸画板
Jul 09 Javascript
vue操作下拉选择器获取选择的数据的id方法
Aug 24 Javascript
jquery获取img的src值实例介绍
Jan 16 jQuery
JS实现贪吃蛇游戏
Nov 15 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 抓取新浪读书频道的小说并生成txt电子书的代码
2009/12/18 PHP
PHP导入Excel到MySQL的方法
2011/04/23 PHP
PHP数组传递是值传递而非引用传递概念纠正
2013/01/31 PHP
PHP实现加强版加密解密类实例
2015/07/29 PHP
PHP CodeIgniter分页实例及多条件查询解决方案(推荐)
2017/05/20 PHP
jquery Ajax 实现加载数据前动画效果的示例代码
2014/02/07 Javascript
一些老手都不一定知道的JavaScript技巧
2014/05/06 Javascript
JavaScript数组去重的3种方法和代码实例
2015/07/01 Javascript
jquery带动画效果幻灯片特效代码
2015/08/27 Javascript
jQuery超精致图片轮播幻灯片特效代码分享
2015/09/10 Javascript
JavaScript获取服务器时间的方法详解
2016/12/11 Javascript
小程序自定义组件实现城市选择功能
2018/07/18 Javascript
解决layer 关闭当前弹窗 关闭遮罩层 input值获取不到的问题
2019/09/25 Javascript
JS中的模糊查询功能
2019/12/08 Javascript
详解小程序横屏方案对比
2020/06/28 Javascript
uniapp 仿微信的右边下拉选择弹出框的实现代码
2020/07/12 Javascript
[04:07]显微镜下的DOTA2第八期——英雄复活动作
2014/06/24 DOTA
[45:15]Optic vs VP 2018国际邀请赛淘汰赛BO3 第一场 8.24
2018/08/25 DOTA
[01:20]DOTA2更新全新英雄 天涯墨客现已加入游戏
2018/08/25 DOTA
python实现多线程的两种方式
2016/05/22 Python
浅谈python抛出异常、自定义异常, 传递异常
2016/06/20 Python
python中将正则过滤的内容输出写入到文件中的实例
2018/10/21 Python
Python面向对象思想与应用入门教程【类与对象】
2019/04/12 Python
Python调用Windows API函数编写录音机和音乐播放器功能
2020/01/05 Python
Python图像处理库PIL的ImageDraw模块介绍详解
2020/02/26 Python
Django自带的用户验证系统实现
2020/12/18 Python
探索HTML5本地存储功能运用技巧
2016/03/02 HTML / CSS
日本最新流行服饰网购:Nissen
2016/07/24 全球购物
幼儿园新学期寄语
2014/01/18 职场文书
运动会方阵解说词
2014/02/12 职场文书
班级旅游计划书
2014/05/03 职场文书
幼儿园优秀班主任事迹材料
2014/05/14 职场文书
公司授权委托书格式范文
2014/10/02 职场文书
优秀大学生自荐信
2015/03/26 职场文书
部队2015年终工作总结
2015/04/02 职场文书
box-shadow单边阴影的实现
2023/05/21 HTML / CSS