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 ...
随机推荐
- node版本如何升级
爬坑后的结论:window系统升级node只能到node官网下载window安装包来覆盖之前的node. 以下为我的爬坑之路: 今天安装了vue cli 3,使用命令时报: You are using ...
- C# 实现DataTable、DataSet与XML互相转换
/**//// <summary> /// 把DataSet.DataTable.DataView格式转换成XML字符串.XML文件 /// </summary> public ...
- cygwin执行.py提示找不到模块,但已经安装模块的解决办法
. 在解决了cygwin中make命令不能使用的问题之后(https://www.cnblogs.com/zhenggege/p/10724122.html),make maskrcnn路径下的set ...
- LC 961. N-Repeated Element in Size 2N Array【签到题】
In a array A of size 2N, there are N+1 unique elements, and exactly one of these elements is repeate ...
- 使用 certbot 自动给 nginx 加上 https
概述 目前,Let's Encrypt 可以算是最好用的 https 证书申请网站了吧.而 certbot 可以算是它的客户端,能够很方便的自动生成 https 证书.我把自己的使用经历记录下来,供以 ...
- 手动部署 Ceph Mimic 三节点
目录 文章目录 目录 前文列表 部署拓扑 存储设备拓扑 网络拓扑 基础系统环境 安装 ceph-deploy 半自动化部署工具 部署 MON 部署 Manager 部署 OSD 部署 MDS 部署 R ...
- 转:Zepto的使用以及注意事项
为什么选择Zepto.js的原因: zepto.js的语法借鉴并且兼容jQuery,会使用jquery就会使用Zepto.js.Zepto.js是移动端的js库.Zepto.js相当于PC端的jQue ...
- vue-cli3的安装使用
一.安装vue-cli3 1.全局安装vue-cli 使用命令 cnpm install -g @vue/cli . npm install -g @vue/cli.yarn global add ...
- bazel编译im2txt的问题
问题: 原本可以正常运行的程序,出现找不到tensorflow的问题.打印出来sys.version和sys.path,发现python版本并不是conda环境的版本 (tensorflow) yua ...
- web容器启动加载WebApplicationContext和初始化DispatcherServlet
原文地址:http://blog.csdn.net/zghwaicsdn/article/details/51186915 ContextLoaderListener监听器,加载ROOT WebApp ...