我想将未登录的用户重定向回登录页面,但我不知道如何在我的情况下实现这一点。
我有:
MainController在启动时每10秒触发一次UserService的refresh()。 现在我想将想要访问account.html的用户重定向到login.html,如果他没有登录。因此我想在AccountController中检查我的UserService的用户变量:
var init = function() {
if(UserService.user==null) {
//redirect
}
}; init();
问题是首先没有填充用户变量,因为MainController从服务器异步获取数据。
使这项工作的最佳方法是什么?我可以使用事件来告诉AccountController数据是否可用。我还可以在AccountController中设置while循环并等待数据可用。
//编辑:我可以在我拥有的每个控制器的init()方法中调用refresh()(之后使用deferred来检查用户变量),但是我必须在每个控制器中复制此代码。 / p>
答案 0 :(得分:0)
不要开始刷新周期,直到get用户的延迟解决为止。
然后使用位置提供者: https://docs.angularjs.org/api/ng/service/$location
答案 1 :(得分:0)
我认为一种常见的方法是包装$http
服务,并在收到服务器的401 - unauthorized
响应时重定向用户。
使用https://djds4rce.wordpress.com/2013/08/13/understanding-angular-http-interceptors/中的示例:
//Works for 1.1.x versions. 1.0.x is similar and can be figured out using code comments
myapp.factory('myHttpResponseInterceptor',['$q','$location',function($q,$location){
return {
response: function(response){
return promise.then(
function success(response) {
return response;
},
function error(response) {
if(response.status === 401){
$location.path('/signin');
return $q.reject(response);
}
else{
return $q.reject(response);
}
});
}
}
}]);
//Http Intercpetor to check auth failures for xhr requests
myapp.config(['$httpProvider',function($httpProvider) {
$httpProvider.interceptors.push('myHttpResponseInterceptor');
}]);
答案 2 :(得分:0)
我会做以下事情:
checkLogin
UserService
$route
和resolve
)localStorage
或Cookie)以及用户是否在/login
页面上。如果它在登录页面上并且已登录,则可以将他带出那里(转到/homeLoggedIn
)。使用$location
服务。如果用户未登录且他不在/login
页面,请将他带到那里!localStorage
JSON对象,并将用户定向到login
。