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 实现的自定义对话框
Mar 24 Javascript
在页面上点击任一链接时触发一个事件的代码
Apr 07 Javascript
jquery.qrcode在线生成二维码使用示例
Aug 21 Javascript
jquery之别踩白块游戏的简单实现
Jul 25 Javascript
js手动播放图片实现图片轮播效果
Sep 17 Javascript
100多个基础常用JS函数和语法集合大全
Feb 16 Javascript
jQuery Validate 相关参数及常用的自定义验证规则
Mar 06 Javascript
详解Vue基于 Nuxt.js 实现服务端渲染(SSR)
Apr 05 Javascript
jQuery实现checkbox全选功能完整实例
Jul 12 jQuery
vue.js中toast用法及使用toast弹框的实例代码
Aug 27 Javascript
angularjs1.X 重构controller 的方法小结
Aug 15 Javascript
vue编写简单的购物车功能
Jan 08 Vue.js
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 中检查或过滤IP地址的实现代码
2011/11/27 PHP
从零开始学YII2框架(六)高级应用程序模板
2014/08/20 PHP
thinkPHP内置字符串截取函数用法详解
2016/11/15 PHP
Laravel-admin之修改操作日志的方法
2019/09/30 PHP
再说AutoComplete自动补全之实现原理
2011/11/05 Javascript
jQuery根据纬度经度查看地图处理程序
2013/05/08 Javascript
兼容IE和FF的图片上传前预览js代码
2013/05/28 Javascript
javascript判断css3动画结束 css3动画结束的回调函数
2015/03/10 Javascript
js事件监听器用法实例详解
2015/06/01 Javascript
js带前后翻页的图片切换效果代码分享
2015/09/08 Javascript
AngularJS基础 ng-cloak 指令简单示例
2016/08/01 Javascript
JS数组返回去重后数据的方法解析
2017/01/03 Javascript
ThinkPHP+jquery实现“加载更多”功能代码
2017/03/11 Javascript
JS设计模式之单例模式(一)
2017/09/29 Javascript
javascript数组拍平方法总结
2018/01/20 Javascript
深入了解javascript 数组的sort方法
2018/06/01 Javascript
Vue配合iView实现省市二级联动的示例代码
2018/07/27 Javascript
Node.js 使用request模块下载文件的实例
2018/09/05 Javascript
js实现动态增加文件域表单功能
2018/10/22 Javascript
webpack3里使用uglifyjs压缩js时打包报错的解决
2018/12/13 Javascript
微信小程序的注册页面包含倒计时验证码、获取用户信息
2019/05/22 Javascript
如何在JavaScript中谨慎使用代码注释
2019/06/21 Javascript
JQuery插件tablesorter表格排序实现过程解析
2020/05/28 jQuery
python中实现数组和列表读取一列的方法
2018/04/03 Python
python将list转为matrix的方法
2018/12/12 Python
Flask之pipenv虚拟环境的实现
2019/11/26 Python
Python如何基于Tesseract实现识别文字功能
2020/06/05 Python
Pandas对DataFrame单列/多列进行运算(map, apply, transform, agg)
2020/06/14 Python
P/Invoke是什么
2015/07/31 面试题
中专生自荐信
2013/10/12 职场文书
大学运动会入场词
2014/02/22 职场文书
规范化管理年活动总结
2014/08/29 职场文书
干部作风整顿自我剖析材料和整改措施
2014/09/18 职场文书
项目战略合作意向书
2015/05/08 职场文书
董事长助理工作总结2015
2015/07/23 职场文书
使用qt quick-ListView仿微信好友列表和聊天列表的示例代码
2021/06/13 Python