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 相关文章推荐
线路分流自动跳转代码;希望对大家有用!
Dec 02 Javascript
web的各种前端打印方法之jquery打印插件jqprint实现网页打印
Jan 09 Javascript
javascript制作的网页侧边弹出框思路及实现代码
May 21 Javascript
JS实现点击文字对应DIV层不停闪动效果的方法
Mar 02 Javascript
Javascript实现通过选择周数显示开始日和结束日的实现代码
May 30 Javascript
微信小程序开发之toast提示插件使用示例
Jun 08 Javascript
react路由配置方式详解
Aug 07 Javascript
Vue项目查看当前使用的elementUI版本的方法
Sep 27 Javascript
详解TypeScript+Vue 插件 vue-class-component的使用总结
Feb 18 Javascript
vue设计一个倒计时秒杀的组件详解
Apr 06 Javascript
js实现随机div颜色位置 类似满天星效果
Oct 24 Javascript
微信小程序picker组件两列关联使用方式
Oct 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将session放入memcached的设置方法
2014/02/14 PHP
Laravel框架实现利用监听器进行sql语句记录功能
2018/06/06 PHP
详解PHP神奇又有用的Trait
2019/03/25 PHP
laravel 解决后端无法获取到前端Post过来的值问题
2019/10/22 PHP
PHP实现新型冠状病毒疫情实时图的实例
2020/02/04 PHP
JavaScript中出现乱码的处理心得
2009/12/24 Javascript
ECMAScript 创建自己的js类库
2012/11/22 Javascript
7个JS基础知识总结
2014/03/05 Javascript
window.location的重写及判断location是否被重写
2014/09/04 Javascript
JavaScript原生对象之Number对象的属性和方法详解
2015/03/13 Javascript
ECMAScript5(ES5)中bind方法使用小结
2015/05/07 Javascript
Jquery操作Ajax方法小结
2015/11/29 Javascript
Jquery获取第一个子元素简单实例
2016/06/02 Javascript
angular分页指令操作
2017/01/09 Javascript
使用vue.js2.0 + ElementUI开发后台管理系统详细教程(二)
2017/01/21 Javascript
浅谈javascript的url参数parse和build函数
2017/03/04 Javascript
vue 子组件向父组件传值方法
2018/02/26 Javascript
vue router 跳转时打开新页面的示例方法
2019/07/28 Javascript
[02:55]DOTA2英雄基础教程 发条技师
2013/12/04 DOTA
Python中使用dom模块生成XML文件示例
2015/04/05 Python
Python使用Phantomjs截屏网页的方法
2018/05/17 Python
在pycharm中python切换解释器失败的解决方法
2018/10/29 Python
Python实现的微信支付方式总结【三种方式】
2019/04/13 Python
python使用turtle绘制国际象棋棋盘
2019/05/23 Python
Python图像处理库PIL的ImageEnhance模块使用介绍
2020/02/26 Python
基于python tkinter的点名小程序功能的实例代码
2020/08/22 Python
python 对象真假值的实例(哪些视为False)
2020/12/11 Python
英国和爱尔兰的自炊式豪华度假小屋:Rural Retreats
2018/06/08 全球购物
应届生求职简历的自我评价怎么写
2013/10/23 职场文书
教师专业理论水平的自我评价分享
2013/11/09 职场文书
个人贷款授权委托书样本
2014/10/07 职场文书
社区学习党的群众路线教育实践活动心得体会
2014/11/03 职场文书
2016银行招聘自荐信
2016/01/28 职场文书
Python图片处理之图片裁剪教程
2021/05/27 Python
Python中基础数据类型 set集合知识点总结
2021/08/02 Python
Node-Red实现MySQL数据库连接的方法
2021/08/07 MySQL