2016-05-13 398 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/