Vue.js 在vue-router.beforeach中进行检查,不限制对路由的访问
首先,我将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'),结果都一样。它知道什么时候应该重定向,但是重定向只在每隔一段时间起作用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页面。问题是它执行检查并在第一次对其进行限制。但第二次尝试允许我转到页面并显示内容。每秒钟的请求似乎都能正确处理路由并重定向到
如果我做了一个完整的请求(页面刷新,输入地址并按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
});