前言

做项目的时候有个需求,就是发现没有登录,竟然也可以进入我的主页,这样肯定是不能容忍的。于是就要让他进入主页的时候,加个判断是否有登录,若没有登录,则返回登录界面,登录成功后还可以跳转到之前进入的页面;若登录,则爱点哪里就点哪里,也就是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 路由拦截(对某些页面需要登陆才能访问)的更多相关文章

  1. vue 路由拦截、axios请求拦截

    路由拦截 项目中,有些页面需要登录后才能进入,例如,在某页面A,用户在操作前需要先进入登录页(此时需要将上一页的地址(/survey/start)作为query存入login页面的地址中,如: htt ...

  2. vue 路由拦截器和请求拦截器

    路由拦截器 已路由为导向 router.beforeEach((to,from,next)=>{ if(to.path=='/login' || localStorage.getItem('to ...

  3. 中文版Postman测试需要登陆才能访问的接口(基于Cookie)

    ApiPost堪称增强版的中文postman,是一个支持团队协作,并可直接生成文档的API调试.管理工具.它支持模拟POST.GET.PUT等常见请求,是后台接口开发者或前端.接口测试人员不可多得的工 ...

  4. 如何请求一个需要登陆才能访问的接口(基于cookie)---apipost

    在后台在开发.调试接口时,常常会遇到需要登陆才能请求的接口. 比如:获取登陆用户的收藏列表,此时,我们就需要模拟登陆状态进行接口调试了.如图: 今天,我们讲解利用ApiPost的环境变量,解决这种需要 ...

  5. vue 路由参数变化,页面不更新的问题

    监控$route 在vue项目中,假使我们在同一个路由下,只是改变路由后面的参数值,如果不监听路由参数值的变化,页面无数据刷新,需手动刷新浏览器,这样做就不是我们的预期效果. 举例:当前路由为  /p ...

  6. vue路由history模式刷新页面出现404问题

    vue hash模式下,URL中存在'#',用'history'模式就能解决这个问题.但是history模式会出现刷新页面后,页面出现404.解决的办法是用nginx配置一下.在nginx的配置文件中 ...

  7. Vue——路由回退至指定页面

    先来引出一下遇到的问题:在做一个移动端支付页面,在付款页面点击支付按钮,支付失败时跳转至支付失败提示页面:支付成功时跳转至支付成功页面.在支付成功页面下,如果用户点击手机自带的“返回”键,就又会跳转至 ...

  8. vue路由守卫+cookie实现页面跳转时验证用户是否登录----(二)设置路由守卫

    上一篇我们已经封装好了cookie方法,登录成功之后也可以吧用户信息存到cookie中,接下来需要在router/index.js中引入一下cookie.js文件 然后继续添加以下代码 /* * be ...

  9. 新来的前端小姐姐问:Vue路由history模式刷新页面出现404问题

    摘要:vue-router 默认 hash 模式 -- 使用 URL 的 hash 来模拟一个完整的 URL,于是当 URL 改变时,页面不会重新加载. 本文分享自华为云社区<学习Vue Rou ...

随机推荐

  1. svn 巧用,如果遇到问题解决不了,而上一个版本可以正常使用,则可以查记录

    svn 巧用,如果遇到问题解决不了 1.svn上一个版本可以正常使用的情况下 2.查看历史 3. 丢失的代码复制回来即可

  2. 黑马vue---8-10、v-cloak、v-text、v-html、v-bind、v-on的基本使用

    黑马vue---8-10.v-cloak.v-text.v-html.v-bind.v-on的基本使用 一.总结 一句话总结: v-bind等这些东西都是用的vue.data里面的变量 1.使用 v- ...

  3. spring boot知识清单

    https://mp.weixin.qq.com/s/q8OI2Ou8-gYP-usjToBbkQ

  4. 前端开发中的Error以及异常捕获

    本文首发于公众号:符合预期的CoyPan 写在前面 在前端项目中,由于JavaScript本身是一个弱类型语言,加上浏览器环境的复杂性,网络问题等等,很容易发生错误.做好网页错误监控,不断优化代码,提 ...

  5. ORA-02291: 违反完整约束条件 - 未找到父项关键字问题解决

    ORA-02291: 违反完整约束条件 - 未找到父项关键字问题解决 总体说说可能出现的原因: 情况场景: 表A中有个字段是外键,关联了表B中的某字段,再往表A插入数据时,会出现这种情况. 可能原因: ...

  6. ORA-00904: "B"."METHOD": 标识符无效,00904. 00000 - "%s: invalid identifier"

    1 SELECT COUNT(1) FROM (SELECT a.id AS "id", a.district AS "district", a.company ...

  7. ubuntu14.04 安装apache+php7.2*

    1.安装apache2 sudo apt-get update sudo apt-get install apache2 这时http://你机器的ip,就可以访问了 2.安装php7.0+及一些必要 ...

  8. FICO相关号码范围IMG设定

    一.定义会计文件号码范围——FBN1 二.定义总账检视的文件号码范围——FAGL_DOCNR 三.指派客户科目群组的号码范围 四.定义供应商号码范围——XKN1  五.维护订单号码范围——KONK

  9. spring使用@Async注解异步处理

    1. 何为异步调用?在解释异步调用之前,我们先来看同步调用的定义:同步就是整个处理过程顺序执行,当各个过程都执行完毕,并返回结果. 异步调用则是只是发送了调用的指令,调用者无需等待被调用的方法完全执行 ...

  10. Python列表排序

    1.冒泡排序 冒泡排序(Bubble Sort)是一种简单的排序算法.它重复地遍历要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.遍历数列的工作是重复地进行直到没有再需要交换,也就 ...