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中的常见排序算法
Mar 27 Javascript
js 字符串操作函数
Jul 25 Javascript
Extjs学习笔记之七 布局
Jan 08 Javascript
WEB高性能开发之疯狂的HTML压缩
Jun 19 Javascript
jQuery的live()方法对hover事件的处理示例
Feb 27 Javascript
js使用onmousemove和onmouseout获取鼠标坐标的方法
Mar 31 Javascript
JavaScript更改字符串的大小写
May 07 Javascript
Angular 页面跳转时传参问题
Aug 01 Javascript
浅谈js键盘事件全面控制
Dec 01 Javascript
详解React Native开源时间日期选择器组件(react-native-datetime)
Sep 13 Javascript
angular的输入和输出的使用方法
Sep 22 Javascript
javascript自定义右键菜单插件
Dec 16 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
PHP4(windows版本)中的COM函数
2006/10/09 PHP
PHP判断搜索引擎蜘蛛并自动记忆到文件的代码
2012/02/04 PHP
php fseek函数读取大文件两种方法
2016/10/12 PHP
php smtp实现发送邮件功能
2017/06/22 PHP
JS 学习笔记 防止发生命名冲突
2009/07/30 Javascript
基于JQuery的cookie插件
2010/04/07 Javascript
直接在JS里创建JSON数据然后遍历使用
2014/07/25 Javascript
jQuery往返城市和日期查询实例讲解
2015/10/09 Javascript
原生JS实现旋转木马式图片轮播插件
2016/04/25 Javascript
Vuejs第十二篇之动态组件全面解析
2016/09/09 Javascript
Bootstrap模态框插件使用详解
2017/05/11 Javascript
从零开始学习搭建React脚手架项目
2018/08/23 Javascript
angular中如何绑定iframe中src的方法
2019/02/01 Javascript
vue 关闭浏览器窗口的时候,清空localStorage的数据示例
2019/11/06 Javascript
Node.js API详解之 vm模块用法实例分析
2020/05/27 Javascript
跟老齐学Python之正规地说一句话
2014/09/28 Python
Python中with及contextlib的用法详解
2017/06/08 Python
Jupyter安装nbextensions,启动提示没有nbextensions库
2020/04/23 Python
Python使用pip安装pySerial串口通讯模块
2018/04/20 Python
详解Python爬取并下载《电影天堂》3千多部电影
2019/04/26 Python
python实现定时压缩指定文件夹发送邮件
2020/12/22 Python
Python OpenCV 使用滑动条来调整函数参数的方法
2019/07/08 Python
python 已知一个字符,在一个list中找出近似值或相似值实现模糊匹配
2020/02/29 Python
python实现猜拳游戏
2020/03/04 Python
Holland & Barrett爱尔兰:英国领先的健康零售商
2019/03/31 全球购物
英国健身超市:Fitness Superstore
2019/06/17 全球购物
Yankee Candle官网:美国最畅销蜡烛品牌之一
2020/01/05 全球购物
巴西本土电商平台:Americanas
2020/06/21 全球购物
产品销售计划书
2014/05/04 职场文书
篮球比赛拉拉队口号
2014/06/10 职场文书
法院反腐倡廉心得体会
2014/09/09 职场文书
个人工作能力自我评价
2015/03/05 职场文书
2015年“七七卢沟桥事变”纪念活动总结
2015/03/24 职场文书
2015年保险公司个人工作总结
2015/05/22 职场文书
听证会主持词
2015/07/03 职场文书
nginx实现发布静态资源的方法
2021/03/31 Servers