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 ...
随机推荐
- drawable SVG 使用
Android会使用一些规则来去帮我们匹配最适合的图片.什么叫最适合的图片?比如我的手机屏幕密度是xxhdpi,那么drawable-xxhdpi文件夹下的图片就是最适合的图片.因此,当我引用andr ...
- smartbi的安装及使用
http://wiki.smartbi.com.cn/pages/viewpage.action?pageId=42011285
- Php+Redis函数使用总结
因项目需求,冷落了redis,今天再重新熟悉一下: <?php //连接 $redis = New Redis(); $redis->connect('127.0.0.1','6379', ...
- linuxs上mono
当前,在Linux系统上架设ASP.NET网站.建设WEB应用工程项目已经在国内流行起来,而“Mono+Jexus”架构模式是Linux承载ASP.NET企业级应用的极为重要的架构方式,这种架构中,J ...
- 详解nohup和& 区别
nohup 一.[解释] 不挂断地运行命令.no hangup的缩写,意即“不挂断”.一般理解&记住一个命令最简单的方法是记住它是什么缩写,就自然理解了这个命令.nohup运行由 Comman ...
- Java调用Redis集群
前文 需要使用以下jar包 Maven项目引用以下配置: <dependency> <groupId>org.apache.commons</groupId> &l ...
- C++ 中set
set特点: 所有元素不会重复,重复插入已经有的新值无效: 所有元素按顺序排列:unordered_set除外 键和值相同,所以set中的值是不可更改的 set的各成员函数列表如下: 1.begin( ...
- k8s1.11.0安装、一个master、一个node、查看node名称是主机名、node是扩容进来的、带cadvisor监控服务
一个master.一个node.查看node节点是主机名 # 安装顺序:先在test1 上安装完必要组件后,就开始在 test2 上单独安装node组件,实现node功能,再返回来配置test1加入集 ...
- SqlServer数据库查看被锁表以及解锁Kill杀死进程
步骤1.查看锁表进程 2.杀死进程 --1.查询锁表进程 spid.和被锁表名称 tableName select request_session_id spid,OBJECT_NAME ...
- 渗透测试 - KALI Linux 学习 - kali linux如何启动METASPLOIT服务
kali 2.0 已经没有metasploit 这个服务了,所以service metasploit start 的方式不起作用. 在kali 2.0中启动带数据库支持的MSF方式如下: #1 首先 ...