视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
vue路由导航守卫和请求拦截以及基于node的token认证的方法
2020-11-27 21:59:14 责编:小采
文档


什么时候需要登录验证与权限控制

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是否失效,如果失效则跳到登陆页面

下载本文
显示全文
专题