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 相关文章推荐
基于Jquery的文字滚动跑马灯插件(一个页面多个滚动区)
Jul 26 Javascript
js 利用className得到对象的实现代码
Nov 15 Javascript
jQuery $.data()方法使用注意细节
Dec 31 Javascript
js创建子窗口并且回传值示例代码
Jul 02 Javascript
jQuery实现自定义右键菜单的树状菜单效果
Sep 02 Javascript
js获取url传值的方法
Dec 18 Javascript
Bootstrap笔记—折叠实例代码
Mar 13 Javascript
详谈js遍历集合(Array,Map,Set)
Apr 06 Javascript
vue轻量级框架无法获取到vue对象解决方法
May 12 Javascript
vue根据条件不同显示不同按钮的操作
Aug 04 Javascript
JavaScript实现商品评价五星好评
Nov 30 Javascript
vue项目中的支付功能实现(微信支付和支付宝支付)
Feb 18 Vue.js
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服务器实现多session并发运行
2006/10/09 PHP
PHP截断标题且兼容utf8和gb2312编码
2013/09/22 PHP
php中instanceof 与 is_a()区别分析
2015/03/03 PHP
php实现将wav文件转换成图像文件并在页面中显示的方法
2015/04/21 PHP
PHP生成随机密码方法汇总
2015/08/27 PHP
yii2超好用的日期组件和时间组件
2016/05/05 PHP
Laravel框架查询构造器简单示例
2019/05/08 PHP
php数组和链表的区别总结
2019/09/20 PHP
JS+CSS设置img在DIV中只显示Img垂直居中的部分
2013/10/24 Javascript
Node.js实现JS文件合并小工具
2016/02/02 Javascript
JavaScript基础教程——入门必看篇
2016/05/20 Javascript
input框中的name和id的区别
2016/11/16 Javascript
ionic3 懒加载
2017/08/16 Javascript
Three.js实现绘制字体模型示例代码
2017/09/26 Javascript
js+css实现红包雨效果
2018/07/12 Javascript
Vue中保存数据到磁盘文件的方法
2018/09/06 Javascript
vue自定义表单生成器form-create使用详解
2019/07/19 Javascript
Element InputNumber 计数器的实现示例
2020/08/03 Javascript
详解node.js创建一个web服务器(Server)的详细步骤
2021/01/15 Javascript
python多线程http下载实现示例
2013/12/30 Python
Python之Scrapy爬虫框架安装及简单使用详解
2017/12/22 Python
解决安装新版PyQt5、PyQT5-tool后打不开并Designer.exe提示no Qt platform plugin的问题
2020/04/24 Python
Python是怎样处理json模块的
2020/07/16 Python
Python QT组件库qtwidgets的使用
2020/11/02 Python
Django利用elasticsearch(搜索引擎)实现搜索功能
2020/11/26 Python
Python urlopen()参数代码示例解析
2020/12/10 Python
css3实现椭圆轨迹旋转的示例代码
2018/10/29 HTML / CSS
学校办公室主任职责
2013/12/27 职场文书
村优秀党员事迹材料
2014/01/15 职场文书
园艺师求职信
2014/04/27 职场文书
服务承诺书怎么写
2014/05/24 职场文书
公安机关纪律作风整顿个人剖析材料材料
2014/10/10 职场文书
企业廉洁教育心得体会
2016/01/20 职场文书
Redis遍历所有key的两个命令(KEYS 和 SCAN)
2021/04/12 Redis
一看就懂的MySQL的聚簇索引及聚簇索引是如何长高的
2021/05/25 MySQL
MySQL数据库之内置函数和自定义函数 function
2022/06/16 MySQL