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 相关文章推荐
各种常用浏览器getBoundingClientRect的解析
May 21 Javascript
解决js数据包含加号+通过ajax传到后台时出现连接错误
Aug 01 Javascript
JavaScript控制各种浏览器全屏模式的方法、属性和事件介绍
Apr 03 Javascript
jQuery中has()方法用法实例
Jan 06 Javascript
JavaScript把数组作为堆栈使用的方法
Mar 20 Javascript
jQuery实现图片文字淡入淡出效果
Dec 21 Javascript
Vue.js动态添加、删除选题的实例代码
Sep 30 Javascript
JS实现的二叉树算法完整实例
Apr 06 Javascript
Bootstrap treeview实现动态加载数据并添加快捷搜索功能
Jan 07 Javascript
javascript标准库(js的标准内置对象)总结
May 26 Javascript
BootStrap中的模态框(modal,弹出层)功能示例代码
Nov 02 Javascript
layui lay-verify form表单自定义验证规则详解
Sep 18 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
屏蔽浏览器缓存另类方法
2006/10/09 PHP
PHP 5.0 Pear安装方法
2006/12/06 PHP
PHP 分页原理分析,大家可以看看
2009/12/21 PHP
让你的PHP7更快之Hugepage用法分析
2016/05/31 PHP
php实现图片按比例截取的方法
2017/02/06 PHP
php无限级评论嵌套实现代码
2018/04/18 PHP
JavaScript Event学习第九章 鼠标事件
2010/02/08 Javascript
javascript静态页面传值的三种方法分享
2013/11/12 Javascript
JavaScript中诡异的delete操作符
2015/03/12 Javascript
js实现基于正则表达式的轻量提示插件
2015/08/29 Javascript
微信小程序 视图容器组件的详解及实例代码
2017/01/19 Javascript
利用策略模式与装饰模式扩展JavaScript表单验证功能
2017/02/14 Javascript
详解vue项目首页加载速度优化
2017/10/18 Javascript
微信小程序实现的一键拨号功能示例
2019/04/24 Javascript
详解基于 Node.js 的轻量级云函数功能实现
2019/07/08 Javascript
Net微信网页开发 使用微信JS-SDK获取当前地理位置过程详解
2019/08/26 Javascript
Python中实现的RC4算法
2015/02/14 Python
Python中处理字符串之isalpha()方法的使用
2015/05/18 Python
pandas中Timestamp类用法详解
2017/12/11 Python
VTK与Python实现机械臂三维模型可视化详解
2017/12/13 Python
利用pandas进行大文件计数处理的方法
2018/07/25 Python
解决pycharm工程启动卡住没反应的问题
2019/01/19 Python
Python @property使用方法解析
2019/09/17 Python
python面向对象之类属性和类方法案例分析
2019/12/30 Python
如何向scrapy中的spider传递参数的几种方法
2020/11/18 Python
python通过cython加密代码
2020/12/11 Python
纯css3使用vw和vh实现自适应的方法
2018/02/09 HTML / CSS
鲜为人知的HTML5语音合成功能
2019/05/17 HTML / CSS
C#实现对任一张表的数据进行增,删,改,查要求,运用Webservice,体现出三层架构
2014/07/11 面试题
成功经营餐厅的创业计划书范文
2013/12/26 职场文书
给同事的道歉信
2014/01/11 职场文书
2014春晚主持词
2014/03/25 职场文书
2015年党员自评材料
2014/12/17 职场文书
2015年工会工作总结范文
2015/07/23 职场文书
2019年手机市场的调研报告2篇
2019/10/10 职场文书
详解Python中的进程和线程
2021/06/23 Python