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/Js脚本处理html元素的自定义属性解析(亲测兼容Firefox与IE)
Nov 25 Javascript
深入分析JSONP跨域的原理
Dec 10 Javascript
JavaScript 实现完美兼容多浏览器的复制功能代码
Apr 28 Javascript
jquery带动画效果幻灯片特效代码
Aug 27 Javascript
JS实现弹性菜单效果代码
Sep 07 Javascript
分享自己用JS做的扫雷小游戏
Feb 17 Javascript
详解js的延迟对象、跨域、模板引擎、弹出层、AJAX【附实例下载】
Dec 19 Javascript
js实现把图片的绝对路径转为base64字符串、blob对象再上传
Dec 29 Javascript
微信端开发--登录小程序步骤
Jan 11 Javascript
React如何利用相对于根目录进行引用组件详解
Oct 09 Javascript
element-ui 上传图片后清空图片显示的实例
Sep 04 Javascript
vue实现新闻展示页的步骤详解
Apr 11 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错误、异常处理类
2014/03/21 PHP
PHP获取当前页面URL函数实例
2014/10/22 PHP
在页面上点击任一链接时触发一个事件的代码
2007/04/07 Javascript
[原创]用javascript实现检测指定目录是否存在的方法
2008/01/12 Javascript
js 绑定带参数的事件以及手动触发事件
2010/04/27 Javascript
使用隐藏的new来创建对象
2011/03/29 Javascript
你的 mixin 真的兼容 ECMAScript 5 吗?
2013/04/11 Javascript
基于socket.io和node.js搭建即时通信系统
2014/07/30 Javascript
javascript记住用户名和登录密码(两种方式)
2015/08/04 Javascript
实例解析Array和String方法
2016/12/14 Javascript
小程序开发实战:实现九宫格界面的导航的代码实现
2017/01/19 Javascript
深入理解Angularjs中$http.post与$.post
2017/05/19 Javascript
jQuery Masonry瀑布流布局神器使用详解
2017/05/25 jQuery
Express + Session 实现登录验证功能
2017/09/08 Javascript
简单的Vue SSR的示例代码
2018/01/12 Javascript
JSON的parse()方法介绍
2019/01/31 Javascript
javascrit中undefined和null的区别详解
2019/04/07 Javascript
浅谈vuex为什么不建议在action中修改state
2020/02/02 Javascript
小程序组件传值和引入sass的方法(使用vant Weapp组件库)
2020/11/24 Javascript
[02:12]2019完美世界全国高校联赛(春季赛)报名开启
2019/03/01 DOTA
Django数据库连接丢失问题的解决方法
2018/12/29 Python
Python lxml解析HTML并用xpath获取元素的方法
2019/01/02 Python
python设计tcp数据包协议类的例子
2019/07/23 Python
python做接口测试的必要性
2019/11/20 Python
python Scrapy框架原理解析
2021/01/04 Python
详解CSS的border边框属性及其在CSS3中的新特性
2016/05/10 HTML / CSS
美国知名的在线旅游服务网站:Priceline
2016/07/23 全球购物
丝绸和人造花卉、植物和树木:Nearly Natural
2018/11/28 全球购物
L*SPACE官网:比基尼、泳装和度假服装
2019/03/18 全球购物
Interflora澳大利亚:同日鲜花速递
2019/06/25 全球购物
班主任新年寄语
2014/04/04 职场文书
体育系毕业生求职自荐信
2014/04/16 职场文书
禁毒宣传工作方案
2014/05/23 职场文书
党员教师一句话承诺
2014/05/30 职场文书
CSS3实现列表无限滚动/轮播效果
2021/06/23 HTML / CSS
java executor包参数处理功能 
2022/02/15 Java/Android