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 相关文章推荐
Javascript 判断函数类型完美解决方案
Sep 02 Javascript
javascript 检测浏览器类型和版本的代码
Sep 15 Javascript
CCPry JS类库 代码
Oct 30 Javascript
JavaScript入门之对象与JSON详解
Oct 21 Javascript
jQuery插件实现控制网页元素动态居中显示
Mar 24 Javascript
Node.js编写组件的三种实现方式
Feb 25 Javascript
jQuery xml字符串的解析、读取及查找方法
Mar 01 Javascript
超链接怎么正确调用javascript函数
May 23 Javascript
jQuery使用$获取对象后检查该对象是否存在的实现方法
Sep 04 Javascript
js多个物体运动功能实例分析
Dec 20 Javascript
前端跨域的几种解决方式总结(推荐)
Aug 16 Javascript
原生js实现each方法实例代码详解
May 27 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 ios推送(代码)
2013/07/01 PHP
ThinkPHP结合AjaxFileUploader实现无刷新文件上传的方法
2014/10/29 PHP
PHP输出一个等腰三角形的方法
2015/05/12 PHP
php in_array() 检查数组中是否存在某个值详解
2016/11/23 PHP
js使用for循环与innerHTML获取选中tr下td值
2014/09/26 Javascript
JavaScript中Number.MIN_VALUE属性的使用示例
2015/06/04 Javascript
使用Web Uploader实现多文件上传
2016/06/08 Javascript
又一枚精彩的弹幕效果jQuery实现
2016/07/25 Javascript
jQuery实现的选择商品飞入文本框动画效果完整实例
2016/08/10 Javascript
Javascript使用SWFUpload进行多文件上传
2016/11/16 Javascript
javascript入门之数组[新手必看]
2016/11/21 Javascript
微信小程序实现左滑动删除效果
2020/03/30 Javascript
Python 时间处理datetime实例
2008/09/06 Python
利用Python yagmail三行代码实现发送邮件
2018/05/11 Python
python机器学习之神经网络实现
2018/10/13 Python
python后端接收前端回传的文件方法
2019/01/02 Python
python实现祝福弹窗效果
2019/04/07 Python
python实现倒计时小工具
2019/07/29 Python
Python程序暂停的正常处理方法
2019/11/07 Python
python标准库OS模块详解
2020/03/10 Python
python开发一个解析protobuf文件的简单编译器
2020/11/17 Python
Python: glob匹配文件的操作
2020/12/11 Python
澳大利亚家具和家居用品在线:BROSA
2017/11/02 全球购物
康拓普公司Java笔面试
2016/09/23 面试题
解释下列WebService名词:WSDL、SOAP、UDDI
2012/06/22 面试题
工艺工程师工作职责
2013/11/23 职场文书
宿舍违规检讨书
2014/01/12 职场文书
公司董事长助理工作职责
2014/07/12 职场文书
2014年社区重阳节活动策划方案
2014/09/16 职场文书
泰山导游词
2015/02/02 职场文书
安阳殷墟导游词
2015/02/10 职场文书
某某幼儿园的教育教学管理调研分析报告
2019/11/29 职场文书
读《工匠精神》有感:热爱工作,精益求精
2019/12/28 职场文书
MySQL 使用自定义变量进行查询优化
2021/05/14 MySQL
python小型的音频操作库mp3Play
2022/04/24 Python
云服务器部署 Web 项目的实现步骤
2022/06/28 Servers