2016-05-13 92 views
0

如果他的会话处于活动状态,我试图在每次加载页面前检查,如果没有,则重定向到登录页面。 这是我App.jsAngularJS routeprovider不会做任何事情

var app = angular.module('Test', ['ngRoute']); 
app.config(function($routeProvider){ 
    $routeProvider 
     .otherwise({ 
      resolve: 
      { 
       "checkUserSession": function($q,$http,$window) 
       { 
        console.log('start of the def') 
        var deffered = $q.defer(); 
        $http.get('/general/php/getCurrentUser.php') 
         .then(function(result) 
         { 
          if(!result) 
          { 
           deffered.reject(); 
           $window.location.href = "/"; 
          } 
          else 
          { 
           deffered.resolve(); 
          } 
         }); 
        $window.location.href = "/"; 

        return deffered.promise; 
       } 
      } 
     }) 
}); 

,它不会执行的console.log中,$ http.get()或任何重定向。 承诺解决或拒绝并不重要,它看起来像“checkUserSession”永远不会执行;

每个页面都包含angular-route.js脚本。

+1

你为什么这样做'$ window.location.href' ? –

+0

如果用户未登录,则将用户重定向到登录页面。但看起来它没有进入checkUserSession。 – troyz

回答

0

使用拦截器。

在我的情况下,我检查本地存储中的身份验证令牌,但您可以在此处使用会话逻辑。

开始angular.module(...).config -

.config(function ($stateProvider, $urlRouterProvider, $httpProvider) { 
$httpProvider.interceptors.push('BearerAuthInterceptor'); 
... 

然后用服务如下:

.factory('BearerAuthInterceptor', function ($q, $injector, $window) { 
    return { 
    request: function (config) { 
     config.headers = config.headers || {}; 
     var tk = $window.localStorage.getItem('token'); 
     if (tk) { 
      config.headers.Authorization = 'Bearer ' + tk; 
     } 
     return config || $q.when(config); 
    }, 
    response: function (response) { 
     return response || $q.when(response); 
    }, 
    responseError: function (rejection) { 
     if (rejection.status === 401) { 
    // Redirect to login ui-route 
      $injector.get('$state').go('login'); 
     } 
     return $q.reject(rejection); 
    } 
    }; 
}) 

一些很好的例子在这里:http://www.webdeveasy.com/interceptors-in-angularjs-and-useful-examples/