Vue.js 在vue-router.beforeach中进行检查,不限制对路由的访问

Vue.js 在vue-router.beforeach中进行检查,不限制对路由的访问,vue.js,vuejs2,vue-router,Vue.js,Vuejs2,Vue Router,首先,我将vuejs 2.0与webpack一起使用,vue路由器(在历史模式-SPA站点)和vuex在webpack开发服务器上运行,并加载热模块 我已经为组件绘制了大约10条路线。该站点运行良好,但现在我添加了一些基于令牌的身份验证。我正在使用router.beforeach执行令牌检查。如果令牌有效,它应该允许他们通过。如果令牌无效,它应该将它们重定向到/login页面。问题是它执行检查并在第一次对其进行限制。但第二次尝试允许我转到页面并显示内容。每秒钟的请求似乎都能正确处理路由并重定向到

首先,我将vuejs 2.0与webpack一起使用,vue路由器(在历史模式-SPA站点)和vuex在webpack开发服务器上运行,并加载热模块

我已经为组件绘制了大约10条路线。该站点运行良好,但现在我添加了一些基于令牌的身份验证。我正在使用router.beforeach执行令牌检查。如果令牌有效,它应该允许他们通过。如果令牌无效,它应该将它们重定向到/login页面。问题是它执行检查并在第一次对其进行限制。但第二次尝试允许我转到页面并显示内容。每秒钟的请求似乎都能正确处理路由并重定向到/login。出于测试目的,我的checkToken()函数总是返回false

代码:

转到主页(“/”),它会按预期重定向到/login。在我的控制台中,我有以下两个条目:

[14:36:30.399]:没有令牌,重定向到登录。(/) [14:36:30.399]:您已进入登录页面

看起来不错。它试图加载“/”并看到没有令牌,然后重定向到/login,在那里,检查显示我们在登录页面上并停止

现在我将单击我的项目链接,该链接将带我到/project。控制台输出:

[14:40:21.322]:没有令牌,重定向到登录。(/项目)

很好,但实际上显示的是项目页面,而不是登录页面

现在我将单击我的站点链接,该链接应将我带到/site。控制台输出:

[14:41:50.790]:没有令牌,重定向到登录。(/站点)[ 14:41:50.792]:您已进入登录页面

看起来不错,浏览器正在显示网站页面。这正是我想看到的

现在我将单击我的请求链接到/request。控制台输出:

[14:44:13.114]:没有令牌,重定向到登录。(/请求)

但再一次,它不是重定向。当我应该看到我的登录页面时,我看到了我的请求页面

这次,我将再次单击“我的项目”链接(/project),该链接错误地显示了项目页面而不是登录页面。控制台输出:

[14:47:12.799]:没有令牌,重定向到登录。(/项目)[ 14:47:12.800]:您已进入登录页面

这一次,它将我的页面重定向到/login页面,这是它应该做的

实际上,我点击的每一个链接都会被适当地重定向,无论我点击的顺序或链接是什么。第一个重定向,第二个不重定向,第三个重定向,第四个重定向,第五个重定向,等等

我试过next('/login')、next('login')和router.push('login'),结果都一样。它知道什么时候应该重定向,但是重定向只在每隔一段时间起作用


如果我做了一个完整的请求(页面刷新,输入地址并按enter键),它将总是按照计划重定向到/登录,但我正在尝试使用SPA来完成此操作。我有什么遗漏吗?

已修复。我的疏忽

这就是路由器代码应该是什么:

router.beforeEach((to, from, next) => {
    if(to.path != '/login') {
        if(checkToken()) { 
            logger('There is a token, resume. (' + to.path + ')');
            next();
        } else {
            logger('There is no token, redirect to login. (' + to.path + ')');
            next('login');
        }
    } else {
        logger('You\'re on the login page');
        next(); // This is where it should have been
    }
    // next(); - This is in the wrong place
});

愚蠢的问题简单的回答,我的
next()
放错了地方,所以它总是在最后处理它。我仍然很好奇为什么它会正确重定向。

你是否尝试过
next(false)
@AmrAly我尝试过,它甚至没有试图阻止任何东西。我在控制台中看到“redirect to login”(重定向到登录)消息,但它仍然会更改页面以显示路由。我建议删除上一个
next()
方法并重试again@AmrAly如果没有最后一个
next()
,控制台会一直告诉我它正在重定向我登录,并且我在那里(完美),但它不会释放我,我的登录组件也不会出现。但这确实让我把注意力集中在最后一个
next()
上,我已经解决了这个问题。我应该在我的
checkToken()
else条件中设置下一个,而不是在if之外。不确定我怎么会错过。如何以及在哪里制作刷新令牌操作?@SuperComupter我建议您打开自己的问题,解决如何获取新令牌的问题。谢谢。在错误的位置调用next()也是我的问题。我假设next()出于某种原因退出了beforeach。
router.beforeEach((to, from, next) => {
    if(to.path != '/login') {
        if(checkToken()) { 
            logger('There is a token, resume. (' + to.path + ')');
            next();
        } else {
            logger('There is no token, redirect to login. (' + to.path + ')');
            next('login');
        }
    } else {
        logger('You\'re on the login page');
        next(); // This is where it should have been
    }
    // next(); - This is in the wrong place
});