2014-09-19 63 views
0

我有以下的角服務:角服務被稱爲兩次

appServices.factory('AuthenticationService', function() { 
    var auth = { 
     isLogged: false 
    } 

    return auth; 
}) 

TokenInterceptor服務:

appServices.factory('TokenInterceptor', function ($q, $window, AuthenticationService) { 
    return { 
     request: function (config) { 
      config.headers = config.headers || {}; 
      if ($window.sessionStorage.token) { 
       config.headers.Authorization = 'Bearer ' + $window.sessionStorage.token; 
      } 
      return config; 
     }, 

     response: function (response) { 
      console.log(AuthenticationService.isLogged) 
      return response || $q.when(response); 
     } 
    }; 
}); 

我推入$httpProvider

$httpProvider.interceptors.push('TokenInterceptor'); 

而且

$routeProvider. 
     when('/', { 
      templateUrl: 'partials/index', 
      controller: IndexCtrl, 
      access: { requiredLogin: true } 
     }) 

AuthenticationService.isLogged = true登錄後,如果我瀏覽到路徑「/」通過agular按鈕,一切正常,但是當頁面被刷新的AuthenticationService再次實例化,我可以看到console.log(AuthenticationService.isLogged)打印false並打印true後inmediately所以頁面導航回「/登錄」。

爲什麼它打印false - > true?刷新後我能做些什麼來保持身份驗證狀態?

編輯:

感謝您的答案。關於認證tutorial的評論,我在跟隨某人提到相同的問題。我最終了解到他們的方法有點麻煩。 AuthenticationService不僅僅是檢查$window.sessionStorage.token中令牌的存在,因此您對於使用某種存儲來說是完全正確的。

最後我只是在做:

appServices.factory('AuthenticationService', function() { 
    isLogged: function() { 
     return $window.sessionStorage.token == true 
    }  
}) 
+1

你可能想看看ngStorage,或者某種存儲機制.. – PSL 2014-09-19 13:16:18

+0

@PSL我不認爲這是重點在這裏。我想的更多的是等待第二個isLoggein = true或試圖避免isLoggein = false。 – eskalera 2014-09-19 13:53:27

+0

對不起mybad。我正確閱讀 – PSL 2014-09-19 14:06:04

回答

1

當頁面加載時,您將它初始化爲false at。

var auth = { 
    isLogged: false 
}; 

所以,當你用它設置爲true登錄後

AuthenticationService.isLogged = true; 

這很好,直到你naviage路程,你的JavaScript上下文丟失,一切又重新開始,此時它再一次假。

你已經在使用sessionStorage,所以你可以堅持這一點,即是這樣的:

AuthenticationService.isLogged = true; 
$window.sessionStorage.isLogged = "yeah"; 

然後用

var auth = { 
    isLogged: $window.sessionStorage.isLogged == "yeah" ? true : false 
}; 

這是一個簡單的例子取代你的初始化,我可能把setLoggedIn或類似的服務,它執行的sessionStorage設置,以便你的東西把它放在一個地方。

1

你可以試試這個:

function init($rootScope) { 
    $rootScope.$on('$routeChangeStart', function (event, next, current) { 

    } 
} 

而在您的應用程序的底部添加.RUN(INIT)到您的角度聲明:

angular 
    .module('app', ['ngRoute']) 
    .config(config) 
    .run(init) 

它會在每次導航器刷新後調用。您可以將數據存儲在$ window.sessionStorage中,並在每次刷新後對其進行測試。