vue路由导航守卫和请求拦截以及基于node的token认证的方法


Posted in Javascript onApril 07, 2019

什么时候需要登录验证与权限控制

1、业务系统通常需要登录才能访问受限资源,在用户未登录情况下访问受限资源需要重定向到登录页面;

2、多个业务系统之间要实现单点登录,即在一个系统或应用已登录的情况下,再访问另一个系统时不需要重复登录;在登录过期或失效时,需要重定向到登录页面

如何使用路由守卫

定义一个index.js页面用来定义页面的路由,代码如下:

import Vue from 'vue'
import Router from 'vue-router'
import blogIndex from '@/views/index'
import loginComponent from '../components/common/login'
Vue.use(Router)
const routes = [
 {
  path: '/blog',
  name: 'blogIndex',
  component: blogIndex
 },
 {
  path: '/login',
  name: 'login',
  component: loginComponent
 }
];
const router = new Router({
 mode: 'hash', // mode的值为history的时候不需要#,为hash的时候需要
 routes
});
export default router;

定义一个guarder.js页面用来定义页面的路由,代码如下:

import NProgress from 'nprogress'
import 'nprogress/nprogress.css'
export default function (router) {
  router.beforeEach((to, from, next) => {
   NProgress.start()
   console.log(to.path, '121212');
   if(localStorage.getItem("useName") === 'null' && to.path !== '/login') {
    console.log(to.path, 'totototototototo2');
    next({path: '/login'})    
   }else{
    next()
   }
  });
  router.afterEach((to, from) => {
    NProgress.done()
  })
}

这里使用的方法是当用户登陆的时候将用户名保存到本地,判断用户名是否存在,不存在则跳到登陆页面

然后再main.js里面引入guarder.js文件

// 注入路由守卫
import guarder from './help/guarder'
// 注册路由守卫
guarder(router)

这样在前端就可以达到一个路由拦截的作用

node配合http拦截做token认证

要做token认证就必须要有token,安装jsonwebtoken模块,cnpm i jsonwebtoken --save

在node的路由模块引入

var jwt = require("jsonwebtoken");
// 登陆
Router.post('/login',function(req,res,next){
  let params = {
    useName: req.body.useName,
    passWord: req.body.passWord,
  };
  userModel.find(params,function(err,doc){
   if(err) {
      res.json({
        states: 0,
        msg: err.message
      });
    }else {
      // 下面代码在登陆成功的时候生成token并返回给前端,前端登陆成功后保存到本地
        let token = jwt.sign(params, '123456', {
            expiresIn: 60*60*1 //token的是时长,这里的12345是密钥,可以自己定义
        });
        console.log(token, 'tokentokentokentokentoken');
        res.json({
          states: 1,
          msg: doc,
          token: token
        });
      }
    }
  });
});

定义一个http.js文件,代码如下:

import axios from 'axios'
import router from '../router'
/**
 * 在请求发送数据之前,对发送数据进行转换
 */
axios.interceptors.request.use(function (config) {
  // 在这里实现对请求前的处理
  let token = localStorage.getItem("token");
  if(token !== 'null'){
    config.headers.token = token;
    // config.headers.Authorization = `token ${sessionStorage.getItem('token')}`
  }
  // console.log(config,'configconfigconfigconfigconfig');
  return config
 })
 
 /**
  * 在ajax接收响应数据之前,进行判断是否响应未登录、如果未登录重定向到登录页面
  */
 axios.interceptors.response.use(function (res) {
  // 在这里实现响应后的处理
  console.log(res.data.status,'resresresresresresres');
  if(res.data.status === 0) {
    router.replace({
      path: 'login'
    })
  }
  return res
 })

 export default axios

在main.js里面引入http模块,并注入到vue实例中

import http from './help/http'
new Vue({
 el: '#app',
 router,
 store,
 http,
 components: { App },
 template: '<App/>'
})

上面代码中request部分,判断是否存在token,并将token存入请求头里面,肉厚后端接受这个token

// 获取最近登陆
Router.post('/getNewUser',function(req,res,next){
  console.log(req.headers.token, 'req.headerreq.headerreq.header');
  let params = {};
  let newUser2 = newUserModel.find(params).skip(0).limit(10).sort({_id:-1});
  newUser2.exec(function(err,doc){
    if(err) {
       res.json({
         states: 0,
         msg: err.message
       });
     }else {
      let token = req.headers.token; // 从headers中获取token
      //下面为解密,判断token是否失效,并返回一个status状态
      jwt.verify(token, '123456', function (err, decode) {
        if (err) { // 时间失效的时候/ 伪造的token 
          res.json({
            states: 1,
            msg: doc,
            status: 0
          });    
          // res.send({'status':0});      
        } else {
          res.json({
            states: 1,
            msg: doc,
            status: 1
          });  
        }
      })
      // res.json({
      //   states: 1,
      //   msg: doc
      // });
     }
  });
 });

上面代码中response部分,接收返回的status来判断token是否失效,如果失效则跳到登陆页面

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
基于jQuery的消息提示插件 DivAlert之旅(二)
Apr 01 Javascript
jQuery下通过$.browser来判断浏览器.
Apr 05 Javascript
autoPlay 基于jquery的图片自动播放效果
Dec 07 Javascript
js模拟点击以提交表单为例兼容主流浏览器
Nov 29 Javascript
jquery 取子节点及当前节点属性值的方法
Aug 24 Javascript
JavaScript中用于四舍五入的Math.round()方法讲解
Jun 15 Javascript
javascript给span标签赋值的方法
Nov 26 Javascript
JQuery解析XML的方法小结
Apr 02 Javascript
一个简单不报错的summernote 图片上传案例
Jul 11 Javascript
使用AngularJS2中的指令实现按钮的切换效果
Mar 27 Javascript
js学习总结_选项卡封装(实例讲解)
Jul 13 Javascript
JavaScript图片处理与合成总结
Mar 04 Javascript
vue自定义指令directive的使用方法
Apr 07 #Javascript
浅谈express.js框架中间件(middleware)
Apr 07 #Javascript
详解vue中this.$emit()的返回值是什么
Apr 07 #Javascript
浅谈javascript中的prototype和__proto__的理解
Apr 07 #Javascript
javascrit中undefined和null的区别详解
Apr 07 #Javascript
详解服务端预渲染之Nuxt(介绍篇)
Apr 07 #Javascript
vue设计一个倒计时秒杀的组件详解
Apr 06 #Javascript
You might like
用PHP读注册表
2006/10/09 PHP
将数字格式的计算结果转为汉字格式
2006/10/09 PHP
收集的DedeCMS一些使用经验
2007/03/17 PHP
php实现多张图片上传加水印技巧
2013/04/18 PHP
PHP中生成UUID自定义函数分享
2015/06/10 PHP
WordPress过滤垃圾评论的几种主要方法小结
2016/07/11 PHP
php版微信支付api.mch.weixin.qq.com域名解析慢原因与解决方法
2016/10/12 PHP
Prototype使用指南之hash.js
2007/01/10 Javascript
Javascript 获取LI里的内容
2008/12/17 Javascript
jQuery.Validate验证库的使用介绍
2013/04/26 Javascript
javascript在myeclipse中报错的解决方法
2013/10/29 Javascript
文本域中换行符的替换示例
2014/03/04 Javascript
jQuery中$.get、$.post、$.getJSON和$.ajax的用法详解
2014/11/19 Javascript
在Google 地图上实现做的标记相连接
2015/01/05 Javascript
BOOTSTRAP时间控件显示在模态框下面的bug修复
2015/02/05 Javascript
JQuery报错Uncaught TypeError: Illegal invocation的处理方法
2015/03/13 Javascript
微信小程序组件 contact-button(客服会话按钮)详解及实例代码
2017/01/10 Javascript
servlet+jquery实现文件上传进度条示例代码
2017/01/25 Javascript
jQuery实现的简单前端搜索功能示例
2017/10/28 jQuery
npm全局模块卸载及默认安装目录修改方法
2018/05/15 Javascript
[27:02]2014 DOTA2国际邀请赛中国区预选赛 5 23 CIS VS LGD第三场
2014/05/24 DOTA
Python中请使用isinstance()判断变量类型
2014/08/25 Python
Python实现股市信息下载的方法
2015/06/15 Python
Python保存MongoDB上的文件到本地的方法
2016/03/16 Python
图文详解WinPE下安装Python
2016/05/17 Python
Python实现ssh批量登录并执行命令
2016/10/25 Python
基于Python代码编辑器的选用(详解)
2017/09/13 Python
python中单下划线_的常见用法总结
2018/07/10 Python
Python制作词云图代码实例
2019/09/09 Python
python元组的概念知识点
2019/11/19 Python
Python+OpenCV图像处理——实现直线检测
2020/10/23 Python
老板电器官方购物商城:老板油烟机、燃气灶、消毒柜、电烤箱
2018/05/30 全球购物
美国踏板车和轻便摩托车销售网站:Mega Motor Madness
2020/02/26 全球购物
大学生年度自我鉴定
2013/10/31 职场文书
学生旷课检讨书500字
2014/10/28 职场文书
学校2016年圣诞节活动总结
2016/03/31 职场文书