在我的应用程序中,当用户登录时,我authService
设置了 internal flag isAuthenticated
。现在,在每次路由更改时,我都会将侦听器附加到$routeChangeStart
检查authService.isAuthenticated()
. 如果没有,它应该重定向到登录路由。
问题是当用户刷新页面(所有authService
设置都丢失)并再次登录时(同时在服务器上仍然有有效的会话)。这不是我想要的。
我想要做的是“阻止”路由更改,直到我获得信息(如果用户通过身份验证)(如果用户通过身份验证,则可以立即获取信息,或者如果在刷新后authService
没有可用信息,则从服务器获取信息)。authService
我有这样的功能authService
// returns promise
currentUser: function() {
if (authService.isAuthenticated()) {
return $q.when(authService.loggedUser);
}
return $http.get('/session').then(function(response) {
authService.loggedUser = response.user;
return $q.when(authService.loggedUser);
});
}
并想在事件监听器中使用它。
$rootScope.$on("$routeChangeStart", function (event, next, current) {
if(isRouteRestricted(next)) {
authService.currentUser().then(null, function() {
$location.path('/login');
});
}
});
问题是它没有按预期工作。我仍然可以在很短的时间内看到目标路线,然后用户被重定向。我相信这是由于承诺的性质,但如何摆脱这种“眨眼”效应?