nuxt.js 在middleware(中间件)中实现路由鉴权操作


Posted in Javascript onNovember 06, 2020

路由鉴权: 就是判断这个路由当前浏览者是否需要权限访问。

一般我是通过判断cookie中存储的token来判断的。

在middleware文件夹下新建“auth.js”的文件

在当前auth.js文件内判断cookie中是否包含token字段

import getCookie from '~/utils/getCookie'

export default function ({route, req, res, redirect}) {
 let isClient = process.client;
 let isServer = process.server;
 let redirectURL = '/sign';
 var token, path;

 // 在服务端
 if (isServer) {
  // 获取服务端cookie
  let cookies = getCookie.getcookiesInServer(req)
  // 获取当前服务端cookie中是否含有token字段
  token = cookies.token ? cookies.token : ''
 }
 // 在客户端
 if (isClient) {
  // 获取客户端(本地)cookie中的token字段
  token = getCookie.getcookiesInClient('token')
 }

 // 判断是否获取到token
 // 未获取到,重定向到登陆页面
 if (!token) {
  redirect(redirectURL)
 }
}

新建获取cookie的文件

~/uitls/getCookie.js

首先:下载js-cookie

npm i js-cookie -s

import Cookie from 'js-cookie'

export default {
 //获取服务端cookie
 getcookiesInServer:function (req) {
  let service_cookie = {};
  req && req.headers.cookie && req.headers.cookie.split(';').forEach(function (val) {
   let parts = val.split('=');
   service_cookie[parts[0].trim()] = (parts[1] || '').trim();
  });
  return service_cookie;
 },
 //获取客户端cookie
 getcookiesInClient:function (key) {
  return Cookie.get(key) ? Cookie.get(key) : ''
 }
}

在需要路由鉴权的page页面中使用

比如在 ~/page/index.vue中使用

<script>
  export default {
   name: 'index',
    // auth 为刚才在在middleware文件夹下新建的auth.js文件
    middleware: 'auth',
  }
</script>

js-cookie 扩展

1.安装js-cookie

npm install js-cookie --save

2.使用

1 引用

import Cookie from 'js-cookie'

2 客户端使用

// 1.获取
Cookie.get(key)
// 2.设置
Cookie.set('name', value, {expires: 过期时间})
// 3.删除
Cookie.remove("name")
// 过期时间设置:
let seconds = 3600;   // 过期时间 /秒
let expires = new Date(new Date() * 1 + seconds * 1000);

补充知识:js 中间件的简单实现原理

1.基础版

我将复杂版的改变了下,该变成不同的方法名,不同的调用方法,但是只要next设置好,比较适合新手查看

class Middleware {
  constructor () {
    this.middleware = (next)=>{//console.log("this.middleware: "+next)
      /*this.middleware: () =>{
        console.log("use: "+fn.call(this, next));
        return fn.call(this, next)*/
      return next();
    }
  }
 
  run (fn) {
    // console.log(this)
    this.middleware(
      () => fn.call(this,"nihaoafddsf")
    )
  }
 
  use (fn) {
    const previousFn = this.middleware
    this.middleware=(next)=>{
      // console.log(next)
      /*() =>{
        console.log("fetch: "+fn.call(this, next));
        return fn.call(this, next)
      }*/
      previousFn.call(this, () =>{
        // console.log("use: "+fn.call(this, next));
        return fn.call(this, next)
      })
    }
  }
  fetch(fn){
    const previousFn = this.middleware
    this.middleware=(next)=>{
      // console.log(next)//() => fn.call(this,"nihaoafddsf")
      previousFn.call(this, () =>{
        console.log("fetch: "+fn)
        return fn.call(this, next)
      })
    }
  }
}
 
let bnm = new Middleware;
bnm.use(
  (next)=>{
    console.log(3)
    console.log(next)
    next()
  }
)
bnm.fetch((next)=>{
  console.log("nihaoa")
  next()
})
 
bnm.run(function (canshu) {
console.log(1)
  console.log(canshu)
})

工具

1.首先,在这里是使用了函数式编程,让函数赋值给变量.

2.巧妙利用了js class 和原型的this原理(当继承的函数被调用时,this 指向的是当前继承的对象,而不是继承的函数所在的原型对象。)

原理剖析

1.为什么可以形成链接

1.利用了工具2,原型的this,达成链表的原理.

nuxt.js 在middleware(中间件)中实现路由鉴权操作

当第一个use 调用的时候,他的previous 就是最原始的this.middleware

同时,将class 的this.middleware 改成自己的.

当第二个调用的时候,他的preious 就是第一个的this.middleware

同理,n个一样的设置

当最后一个调用完毕,此时的this.middleware指向的是最后一个设置的.

2.如何触发

它使用了run的方法,看起来真的像java的线程模块

nuxt.js 在middleware(中间件)中实现路由鉴权操作

启动的是最后一个绑定的this.middleware,如我前面所讲.

所以你会看到,当你点击的时候,它立刻出发到了fetch()方法,

3.如何触发到最开始

按我前面的讲法,应该是先触发最后一个,为什么他会触发第一个,是的,当我使用复杂版的时候,我也是很懵逼,搞不懂.然后就有了一开始,我将她变成多个不同的方法,对这些方法依次调用.这样总算扒开了它的三次链调,

更应该称之为递归,如果你在next() 方法之后,相应的填写一些的方法,它一样会执行.就像递归一样.但他又有链表的特性.真的神奇.

nuxt.js 在middleware(中间件)中实现路由鉴权操作

这就是他的链式调用利用,我前面讲的两点.

这样他返回到了第一次.

4.开始依次触发相应的,达成中间件的一次调用

nuxt.js 在middleware(中间件)中实现路由鉴权操作

他开始调用

调用完成后返回到return

nuxt.js 在middleware(中间件)中实现路由鉴权操作

然后按照一开始来的路程原路返回.

2.进阶版,如何节省代码,才是我们的中级目标

js一些黑魔法,才是真正有意思的,

尤其在调试的时候,如果不熟悉,你就会以为他只运转了以次,其实,他已经运转了很多次了.

class Middleware {
 constructor () {
  this.i = 0;
  this.middleware = (next) => { console.log(next);return next()}
 }
 
 run (fn) {
  console.log(this)
  this.middleware(
   () => fn.call(this)
  )
 }
 
 use (fn) {
  const previousFn = this.middleware
  this.middleware = (next) =>
   previousFn.call(this, () =>{
      console.log(fn);
    return fn.call(this, next)
   })
 }
}
 
const instance = new Middleware()
 
instance.use(function (next) {
 setTimeout(() => {
  console.log('first')
  this.firstMiddlewareLoaded = true
  next()
 }, 500)
})
 
instance.use(function (next) {
 setTimeout(() => {
  console.log('second')
  this.secondMiddlewareLoaded = true
  next()
 }, 250)
})
 
instance.use(function (next) {
  console.log('third')
  this.ThirdMiddlewareLoaded = true
  next()
})
const start = new Date()
instance.run(function () {
 console.log('first middleware loaded:', this.firstMiddlewareLoaded)
 console.log('second middleware loaded:', this.secondMiddlewareLoaded)
 console.log('Third middleware loaded:', this.ThirdMiddlewareLoaded)
 console.log('time passed:', new Date() - start)
})

写法还是一样,就是它这里有些很多疑惑的问题.主要就是调用函数套两层的问题

外面套了两层,当使用call的时候,使用函数式编程,他就无法读取的到最内层所带的next()方法,

他这里使用了setimeout ,因为程序立刻执行完毕,它没有next(),或者next没有执行到,他就是会立刻返回了.

但是计时器一到就立刻调用了.这就是原因.也是一些疑惑的问题

以上这篇nuxt.js 在middleware(中间件)中实现路由鉴权操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
Javascript 中的类和闭包
Jan 08 Javascript
jCallout 轻松实现气泡提示功能
Sep 22 Javascript
js jquery ajax的几种用法总结(及优缺点介绍)
Jan 28 Javascript
js过滤特殊字符输入适合输入、粘贴、拖拽多种情况
Mar 22 Javascript
Bootstrap禁用响应式布局的实现方法
Mar 09 Javascript
vue2.0 axios跨域并渲染的问题解决方法
Mar 08 Javascript
微信小程序实现topBar底部选择栏效果
Jul 20 Javascript
如何在Vue.js中实现标签页组件详解
Jan 02 Javascript
vue.js的vue-cli脚手架中使用百度地图API的实例
Jan 21 Javascript
vue2.0项目集成Cesium的实现方法
Jul 30 Javascript
解决layui弹框失效的问题
Sep 09 Javascript
JavaScript数组及常见操作方法小结
Nov 13 Javascript
vue中的计算属性和侦听属性
Nov 06 #Javascript
nuxt.js添加环境变量,区分项目打包环境操作
Nov 06 #Javascript
使用Vue实现一个树组件的示例
Nov 06 #Javascript
Nuxt.js 静态资源和打包的操作
Nov 06 #Javascript
微信小程序基于ColorUI构建皮皮虾短视频去水印组件
Nov 04 #Javascript
vue 判断页面是首次进入还是再次刷新的实例
Nov 05 #Javascript
vue created钩子函数与mounted钩子函数的用法区别
Nov 05 #Javascript
You might like
PHP 开发环境配置(Zend Server安装)
2010/04/28 PHP
Yii中Model(模型)的创建及使用方法
2015/12/28 PHP
PHP命名空间和自动加载类
2016/04/03 PHP
php实现每日签到功能
2018/11/29 PHP
jQuery ctrl+Enter shift+Enter实现代码
2010/02/07 Javascript
屏蔽网页右键复制和ctrl+c复制的js代码
2013/01/04 Javascript
js模拟点击以提交表单为例兼容主流浏览器
2013/11/29 Javascript
jQuery实现给页面换肤的方法
2015/05/30 Javascript
js实现基于正则表达式的轻量提示插件
2015/08/29 Javascript
浅析JavaScript作用域链、执行上下文与闭包
2016/02/01 Javascript
AngularJS入门(用ng-repeat指令实现循环输出
2016/05/05 Javascript
jQuery对table表格进行增删改查
2020/12/22 Javascript
微信小程序 PHP后端form表单提交实例详解
2017/01/12 Javascript
微信小程序 登录实例详解
2017/01/16 Javascript
bootstrap 模态框(modal)实现水平垂直居中显示
2017/01/23 Javascript
深入浅析AngularJS中的一次性数据绑定 (bindonce)
2017/05/11 Javascript
学习React中ref的两个demo示例
2018/08/14 Javascript
node.js中module模块的功能理解与用法实例分析
2020/02/14 Javascript
vue render函数动态加载img的src路径操作
2020/10/26 Javascript
python迭代器与生成器详解
2016/03/10 Python
简单实现python进度条脚本
2017/12/18 Python
Python/ArcPy遍历指定目录中的MDB文件方法
2018/10/27 Python
Python面向对象程序设计OOP深入分析【构造函数,组合类,工具类等】
2019/01/05 Python
python异常处理和日志处理方式
2019/12/24 Python
浅谈Python的方法解析顺序(MRO)
2020/03/05 Python
python利用pytesseract 实现本地识别图片文字
2020/12/14 Python
CSS3制作漂亮的照片墙的实现代码
2016/06/08 HTML / CSS
html5实现输入框fixed定位在屏幕最底部兼容性
2020/07/03 HTML / CSS
软件测试面试题
2014/01/05 面试题
服务口号大全
2014/06/11 职场文书
公司领导班子召开党的群众路线教育实践活动总结大会新闻稿
2014/10/21 职场文书
基层党员学习党的群众路线教育实践活动心得体会
2014/11/04 职场文书
烛光里的微笑观后感
2015/06/17 职场文书
社区安全温馨提示语
2015/07/14 职场文书
优秀的商业计划书,让融资一步到位
2019/05/07 职场文书
java高级用法JNA强大的Memory和Pointer
2022/04/19 Java/Android