Angular.JS重定向未登录用户

时间:2015-12-23 13:19:35

标签: javascript angularjs

我想将未登录的用户重定向回登录页面,但我不知道如何在我的情况下实现这一点。

我有:

  • MainController:附加到body标签 - 可在整个应用程序中使用
  • AccountController:通过路由连接到account.html
  • LoginController:通过路由连接到login.html
  • UserService:来自服务器的用户对象和用于从服务器重新填充它的refresh()方法

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>

3 个答案:

答案 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)

我会做以下事情:

  1. checkLogin
  2. 中创建一个功能UserService
  3. 在每个控制器初始化时,调用此函数(您也可以使用$routeresolve
  4. 检查用户是否已登录(变量,localStorage或Cookie)以及用户是否在/login页面上。如果它在登录页面上并且已登录,则可以将他带出那里(转到/homeLoggedIn)。使用$location服务。如果用户未登录且他不在/login页面,请将他带到那里!
  5. 添加http拦截器以检查401响应。如果发生这种情况,请删除Cookie,变量ou localStorage JSON对象,并将用户定向到login