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 相关文章推荐
用js设置下拉框为只读的小技巧
Apr 10 Javascript
js的touch事件的实际引用
Oct 13 Javascript
javascript制作幻灯片(360度全景图片)
Jul 28 Javascript
jQuery Easyui使用(二)之可折叠面板动态加载无效果的解决方法
Aug 17 Javascript
JS控制div跳转到指定的位置的几种解决方案总结
Nov 05 Javascript
vue.js事件处理器是什么
Mar 20 Javascript
Vue.js 2.0学习教程之从基础到组件详解
Apr 24 Javascript
JS库中的Particles.js在vue上的运用案例分析
Sep 13 Javascript
vue生成随机验证码的示例代码
Sep 29 Javascript
vue.js或js实现中文A-Z排序的方法
Mar 08 Javascript
layer.open组件获取弹出层页面变量、函数的实例
Sep 25 Javascript
extjs图形绘制之饼图实现方法分析
Mar 06 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实现mysql同步的实现方法
2009/10/21 PHP
PHP array_push 数组函数
2009/12/26 PHP
php 网页播放器用来播放在线视频的代码(自动判断并选择视频文件类型)
2010/06/03 PHP
javascript实现面向对象类的功能书写技巧
2010/03/07 Javascript
javascript的函数、创建对象、封装、属性和方法、继承
2011/03/10 Javascript
JS测试显示屏分辨率以及屏幕尺寸的方法
2013/11/22 Javascript
json的定义、标准格式及json字符串检验
2014/05/11 Javascript
搭建pomelo 开发环境
2014/06/24 Javascript
简述Jquery与DOM对象
2015/07/10 Javascript
bootstrap datepicker限定可选时间范围实现方法
2016/09/28 Javascript
NodeJS处理Express中异步错误
2017/03/26 NodeJs
Vuejs实现带样式的单文件组件新方法
2017/05/02 Javascript
JS实现的简单折叠展开动画效果示例
2018/04/28 Javascript
小程序实现列表点赞功能
2018/11/02 Javascript
node中使用log4js4.x版本记录日志的方法
2019/08/20 Javascript
详解Vue 单文件组件的三种写法
2020/02/19 Javascript
微信小程序自定义胶囊样式
2020/12/27 Javascript
利用Python的Flask框架来构建一个简单的数字商品支付解决方案
2015/03/31 Python
python批量添加zabbix Screens的两个脚本分享
2017/01/16 Python
Python 字符串大小写转换的简单实例
2017/01/21 Python
python+opencv实现阈值分割
2018/12/26 Python
python3+PyQt5 创建多线程网络应用-TCP客户端和TCP服务器实例
2019/06/17 Python
Django 开发调试工具 Django-debug-toolbar使用详解
2019/07/23 Python
python单例设计模式实现解析
2020/01/07 Python
Python PyQt5模块实现窗口GUI界面代码实例
2020/05/12 Python
Python的历史与优缺点整理
2020/05/26 Python
美国最受欢迎的度假租赁网站:VRBO
2016/08/02 全球购物
Toppik顶丰增发纤维官网:解决头发稀疏
2017/12/30 全球购物
英文简历自荐信范文
2013/12/11 职场文书
幼儿园家长评语大全
2014/04/16 职场文书
暖通工程师岗位职责
2014/06/12 职场文书
2014年实习生工作总结
2014/11/27 职场文书
2015年端午节活动方案
2015/05/05 职场文书
Vue项目中如何封装axios(统一管理http请求)
2021/05/02 Vue.js
python基础入门之字典和集合
2021/06/13 Python
java如何实现socket连接方法封装
2021/09/25 Java/Android