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 相关文章推荐
js树形控件脚本代码
Jul 24 Javascript
jQuery EasyUI API 中文文档 - Tree树使用介绍
Nov 19 Javascript
jquery的ajax()函数传值中文乱码解决方法介绍
Nov 08 Javascript
jQuery 计算iframe 窗口大小的方法
May 13 Javascript
JS是按值传递还是按引用传递
Jan 30 Javascript
js实现随屏幕滚动的带缓冲效果的右下角广告代码
Sep 04 Javascript
微信小程序 教程之注册页面
Oct 17 Javascript
AngularJS日程表案例详解
Aug 15 Javascript
vue项目实现github在线预览功能
Jun 20 Javascript
layui中的switch开关实现方法
Sep 03 Javascript
Angular封装表单控件及思想总结
Dec 11 Javascript
JS Object构造函数之Object.freeze
Apr 28 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
星际初学者游戏中永远要做的事
2020/03/04 星际争霸
centos 5.6 升级php到5.3的方法
2011/05/14 PHP
PHP文件上传判断file是否己选择上传文件的方法
2014/11/10 PHP
PHP大文件分片上传的实现方法
2018/10/28 PHP
PHP面向对象程序设计之构造方法和析构方法详解
2019/06/13 PHP
php简单检测404页面的方法示例
2019/08/23 PHP
关于Laravel参数验证的一些疑与惑
2019/11/19 PHP
window.event快达到全浏览器支持了,以后使用就方便了
2011/11/30 Javascript
js数组转json并在后台对其解析具体实现
2013/11/20 Javascript
分享33个jQuery与CSS3实现的绚丽鼠标悬停效果
2014/12/15 Javascript
javascript实用方法总结
2015/02/06 Javascript
Angularjs 设置全局变量的方法总结
2016/10/20 Javascript
Bootstrap轮播图的使用和理解4
2016/12/14 Javascript
jQuery插件HighCharts绘制2D金字塔图效果示例【附demo源码下载】
2017/03/09 Javascript
利用Vue-draggable组件实现Vue项目中表格内容的拖拽排序
2019/06/07 Javascript
vue.js实现图书管理功能
2019/09/24 Javascript
python之import机制详解
2014/07/03 Python
Python实现程序的单一实例用法分析
2015/06/03 Python
python比较两个列表大小的方法
2015/07/11 Python
Python安装第三方库及常见问题处理方法汇总
2016/09/13 Python
深入理解python中函数传递参数是值传递还是引用传递
2017/11/07 Python
Python基于socket实现简单的即时通讯功能示例
2018/01/16 Python
Python Requests库基本用法示例
2018/08/20 Python
详解Python中openpyxl模块基本用法
2021/02/23 Python
CSS3中Transform动画属性用法详解
2016/07/04 HTML / CSS
以设计师精品品质提供快速时尚:PopJulia
2018/01/09 全球购物
The Beach People美国:澳洲海滨奢华品牌
2018/07/05 全球购物
俄罗斯小米家用电器、电子产品和智能家居商店:Poood.ru
2020/04/03 全球购物
世界经理人咨询有限公司面试
2014/09/23 面试题
写求职信有什么意义
2014/02/17 职场文书
毕业寄语大全
2014/04/09 职场文书
住房抵押登记委托书
2014/09/27 职场文书
维稳工作承诺书
2015/01/20 职场文书
教师节感谢信
2015/01/22 职场文书
2016年全国爱眼日宣传教育活动总结
2016/04/05 职场文书
springboot利用redis、Redisson处理并发问题的操作
2021/06/18 Java/Android