Vue 路由拦截(对某些页面需要登陆才能访问)
前言
做项目的时候有个需求,就是发现没有登录,竟然也可以进入我的主页,这样肯定是不能容忍的。于是就要让他进入主页的时候,加个判断是否有登录,若没有登录,则返回登录界面,登录成功后还可以跳转到之前进入的页面;若登录,则爱点哪里就点哪里,也就是vue中的路由拦截。
PS:可能有点啰嗦,但是讲得还算清楚,若只想实现功能,直接复制代码去实战也可以啦,写这篇的时候是10.24,我们程序员的节日,先祝各位大佬节日快乐,无BUG,今晚实现这个功能也是很快乐的呢,特意写篇博客记录一下,希望能帮助到你们!
路由拦截其实很简单:1)加上meta。2)router.beforeEach函数加上判断即可,具体往下瞧哦~
接下来进入代码实现环节:
1.首先在需要拦截的页面的路由上加一个标识,meta,例如

在全局路由上添加meta:
{path:"/index",name:'index',component:ShowBlogs,meta:{requireAuth:true}},
2.然后在全局路由那里做下判断(一般路由router写在main.js下),如果meta为真,就进入下一个判断,登录的时候我是有将账号username存储起来,于是我根据这一点,如果username不存在,那他就是没登录,即满足meta为真&&username不存在,就让他路由跳转到登录页面
new Vue({
el: '#app',
},
router:router,
store,
components: { App },
template: '<App/>',
created () {
router.beforeEach((to, from, next) => {
var _this = this;
if(to.meta.requireAuth ){
if(JSON.parse(localStorage.getItem("login"))==null){
console.log('没有登录')
_this.$router.push({path: '/',query: {redirect: to.fullPath}})
next()
} else {
_this.$router.push({path: to.fullPath})
next()
}
}
else {
next();
}
});
}
})
敲黑板啦 亲,注意集中力啦
首先:1)要注意this的指向,一开始用this.$router得到是unfinded,原来是this的指向有问题,所以要存储一下this的指向
2)这样我是放在vue的created创建函数下,也可以放在外面
3)这点是最重要的一点,先来看一下现在的逻辑:首先路由点击跳转另外一个路由的时候会先进入beforeEach这个生命函数中,然后判断这个路由是否是需要拦截的路由(根据meta),如果是就进入第二层判断,存储中是否有username,如果没有就跳到‘/’,也就是我们的登录页面,进入登录页面,又是一个新的路由,又判断登录页面是否是需要拦截的路由,否,成功跳入。登录页面那登录成功就要跳到/index这个路由,先进入beforeEach,是需要拦截的,这次有username,就路由push到index,然后要跳到index路由,又进入beforeEach,递归了,大家发现没有,一直重复跳到index路由,出不去,我也是console.log打印了1000多下,内存溢出才发现。所以我需要用一个变量来控制,如下图才是正确的操作:

正确的写法:
new Vue({
el: '#app',
data(){
return{
requireAuthNum:1
}
},
router:router,
store,
components: { App },
template: '<App/>',
created () {
router.beforeEach((to, from, next) => {
var _this = this;
// if (to.matched.some(record => record.meta.requireAuth)){ // 判断该路由是否需要登录权限
if(to.meta.requireAuth && _this.requireAuthNum==1){
if(JSON.parse(localStorage.getItem("login"))==null){
console.log('没有登录')
_this.$router.push({path: '/',query: {redirect: to.fullPath}})
next()
} else {
_this.requireAuthNum++;
_this.$router.push({path: to.fullPath})
next()
}
}
else {
_this.requireAuthNum = 1;
next();
}
});
}
})
4)这次不只是meta为真就可以,还需要变量requireAuthNum为1才可以进入,理一下思路:点击index路由,先进入beforeEach,是需要拦截的,没有username,跳到登录页面,登录页面成功就跳到index页面,新的路由,来,先进入beforeEach,是需要拦截的且requireAuthNum刚开始为1,有username,满足条件,跳到/index路由,注意,这次requireAuthNum++,变成2,新的路由,先进入beforeEach,是需要拦截的,这时的requireAuthNum++了,不为1,跳出判断,于是就成功跳到index路由。
5)上面的逻辑需要大家好好看一下哦,跟着本博主的思路走,边看代码边看文字的说明,还有一点小细节:就是我是index页面因为没有登录而跳到登录页面,如果登录成功应该跳到哪里,是跳到index吗,那要是我是add页面跳到登录页面,那是不是应该登录成功就跳到add页面,所以登录页面那的跳转不能写死,以前我登录成功就跳到index,如:_this.$router.push({path: '/index'});现在加上路由拦截就需要写成动态了,不知道大家有没有发现我途中的112行那的username不存在跳到登录页面,还加上query: {redirect: to.fullPath},此时的路径是/?redirect:/.......,我这里是此时的路径是/?redirect:/index,主要是存储我到底是哪个页面跳转过来的,登录页面那好做判断,login.vue判断如下:
localStorage.setItem("login",JSON.stringify(login));
let redirect = decodeURIComponent(this.$route.query.redirect || '/');
console.log(redirect);
if(redirect == '/'){
_this.$router.push({path: '/index'});
console.log('login');
}else{
_this.$router.push({path: redirect});
console.log('重定向回去')
}
this.$route.query会自动编码,所以我需要decodeURIComponent给我解码。
redirect 判断是不是别的页面跳转过来的,此时的redirect打印出来的是/index,(携带参数就是其他页面跳过来的)这样我们就可以做判断 。 感谢文章:https://blog.csdn.net/Mote123/article/details/92635850、
https://www.jianshu.com/p/2146341f75c6 收工,晚安!
Vue 路由拦截(对某些页面需要登陆才能访问)的更多相关文章
- vue 路由拦截、axios请求拦截
路由拦截 项目中,有些页面需要登录后才能进入,例如,在某页面A,用户在操作前需要先进入登录页(此时需要将上一页的地址(/survey/start)作为query存入login页面的地址中,如: htt ...
- vue 路由拦截器和请求拦截器
路由拦截器 已路由为导向 router.beforeEach((to,from,next)=>{ if(to.path=='/login' || localStorage.getItem('to ...
- 中文版Postman测试需要登陆才能访问的接口(基于Cookie)
ApiPost堪称增强版的中文postman,是一个支持团队协作,并可直接生成文档的API调试.管理工具.它支持模拟POST.GET.PUT等常见请求,是后台接口开发者或前端.接口测试人员不可多得的工 ...
- 如何请求一个需要登陆才能访问的接口(基于cookie)---apipost
在后台在开发.调试接口时,常常会遇到需要登陆才能请求的接口. 比如:获取登陆用户的收藏列表,此时,我们就需要模拟登陆状态进行接口调试了.如图: 今天,我们讲解利用ApiPost的环境变量,解决这种需要 ...
- vue 路由参数变化,页面不更新的问题
监控$route 在vue项目中,假使我们在同一个路由下,只是改变路由后面的参数值,如果不监听路由参数值的变化,页面无数据刷新,需手动刷新浏览器,这样做就不是我们的预期效果. 举例:当前路由为 /p ...
- vue路由history模式刷新页面出现404问题
vue hash模式下,URL中存在'#',用'history'模式就能解决这个问题.但是history模式会出现刷新页面后,页面出现404.解决的办法是用nginx配置一下.在nginx的配置文件中 ...
- Vue——路由回退至指定页面
先来引出一下遇到的问题:在做一个移动端支付页面,在付款页面点击支付按钮,支付失败时跳转至支付失败提示页面:支付成功时跳转至支付成功页面.在支付成功页面下,如果用户点击手机自带的“返回”键,就又会跳转至 ...
- vue路由守卫+cookie实现页面跳转时验证用户是否登录----(二)设置路由守卫
上一篇我们已经封装好了cookie方法,登录成功之后也可以吧用户信息存到cookie中,接下来需要在router/index.js中引入一下cookie.js文件 然后继续添加以下代码 /* * be ...
- 新来的前端小姐姐问:Vue路由history模式刷新页面出现404问题
摘要:vue-router 默认 hash 模式 -- 使用 URL 的 hash 来模拟一个完整的 URL,于是当 URL 改变时,页面不会重新加载. 本文分享自华为云社区<学习Vue Rou ...
随机推荐
- Android热修复技术原理详解
阿里Dexposed -- native解决方案 原理: 直接在native层进行方法的结构体信息对换,从而实现完美的方法新旧替换,从而实现热修复功能 他的思想完全来源于Xposed框架,完美诠释 ...
- [转]zookeeper入门
zookeeper的目标是将复杂且容易出错的分布式一致性服务封装起来,构成一个高效可靠的原语集,并以一系列简单易用的接口提供给用户使用. 参考文章:http://developer.51cto.com ...
- LC 425. Word Squares 【lock,hard】
Given a set of words (without duplicates), find all word squares you can build from them. A sequence ...
- LC 954. Array of Doubled Pairs
Given an array of integers A with even length, return true if and only if it is possible to reorder ...
- EvenBus源码分析
概述 一般使用EventBus的组件类,类似下面这种方式: public class SampleComponent extends Fragment { @Override public void ...
- 电脑上不了网,但是能登录QQ 问题解决方案
电脑上不了网,但是能登录QQ 问题解决方案 问题现象 个人电脑连上Wifi,打不开百度等网页,但是能登录QQ. 解决方案 1.打开命令提示对话框(Win+R) 2.输入ipconfig/display ...
- 关于SVN的405错误Server sent unexpected return value (405 Method Not Allowed)的解决办法
一大早上捣鼓项目提交的时候出现这个错误: svn:server sent unexpected return value 405 method not allowed 百度了很多解决办法都没有解决,看 ...
- SQL Server 2005 和自增长主键identity说再见——NEWSEQUENTIALID()(转载)
在SQL Server 2005环境下,表的主键应该怎样设计.目前主要用到的主键方案共三种: 自动增长主键 手动增长主键 UNIQUEIDENTIFIER主键 1.先说自动增长主键,它的优点是简单,类 ...
- 如何使用StarUML for Mac创建和修改元素
StarUML for Mac是一款UML软件建模器,支持快速编辑中的许多缩写,一次创建元素和关系,如子类,支持接口等.如何使用StarUML for Mac创建和修改元素?下面我们来介绍一下. 如何 ...
- SQL-T
Mysql函数.语句记录 增加 INSERT INTO table_name (列1, 列2,...) VALUES (值1, 值2,....) 删除 DELETE FROM 表名称 WHERE 列名 ...