2015-04-14 50 views
3

我已經成功地設置了一個Spring Security項目,它在用戶登錄時對用戶進行身份驗證。但是,在他登錄後,我想要檢索此用戶對象(它位於Spring安全性)通過AngularJS的每個控制器功能中的Rest控制器。AngularJS從控制器上檢索每個請求的用戶對象

爲了澄清,我怎樣才能在每個控制器中調用以下方法來檢索用戶對象?

@RequestMapping(value = "/getLoggedInUser", method = RequestMethod.GET, headers = "Accept=application/json") 
    public User getLoggedInUser() { 
     Authentication auth = SecurityContextHolder.getContext().getAuthentication(); 
     if (!(auth instanceof AnonymousAuthenticationToken)) { 
      User user = (User) SecurityContextHolder.getContext().getAuthentication() 
        .getPrincipal(); 
      return user; 
     } 
     return null; 
} 

我所做的是以下幾點:

$http.get(urlBase+'/getLoggedInUser'). 
success(function(data) { 
    $scope.users = data; 
    console.log("The logged in user is: " + data.firstname); 
}) 

這工作,並將其打印出名字,但我得到一些奇怪的行爲,當我把上面的方法內的另一個$ HTTP GET方法。在每個angularjs控制器的開始處添加此函數以獲取此用戶對象並檢查它是否爲null或設置(所以我可以使用它進行一些邏輯處理),是否有更好的選項或可能性?

***********更新*********** 在pankajparkar的建議後,我現在能夠簡單地檢索用戶對象。我把get方法在應用工廠直接作爲這樣的:

myApp.factory('accountService', function($http) { 
    return { 
     getUser: function() { 
      return $http.get(urlBase+'/getLoggedInUser'); 
     } 
    }; 
}); 

而且從每一個控制器,我可以考績了AccountService方法並執行以下操作:

var handleSuccess = function(user, status) { 
    $scope.user = user; 
}; 
accountService.getUser().success(handleSuccess); 

現在這工作正常,我可以像這樣獲取每個控制器中的數據。這個可以嗎?或者它可以比這更好一點?

+1

你需要使用角度http攔截器 –

+0

你在哪裏定義** datax **。這是一個錯字? – Reena

+0

@Reena對不起,這是我在編輯它的帖子中的錯誤。 – Moody

回答

1

您可以使用httpInterceptor,它可以看你的每個$http請求和響應。基本上,你可以創建一個服務,request & response功能

angular.module('dashboardApp').factory('httpInterceptor', function httpInterceptor ($q, $window, $location) { 
    return function (promise) { 
     var success = function (response) { 
      return response; 
     }; 

     var error = function (response) { 
      if (response.status === 401) { 
       $location.url('/login'); 
      } 

      return $q.reject(response); 
     }; 

     return promise.then(success, error); 
    }; 
}); 

然後做添加在角生命週期的配置階段這個攔截器,它使用app.config(配置塊)

配置

angular.module('dashboardApp').config(['$httpProvider', function($httpProvider){ 
    $httpProvider.interceptors.push('myHttpInterceptor'); 
    //your other code here like register state & configuration settings 
}]); 

另請參閱this link,這將爲您提供更好的構思來實現此目的。

+0

@JustLearning哪個錯誤? –

+0

謝謝你的評論我真的很感激它。但是這樣做會導致以下錯誤: 無法讀取未定義的屬性'responseInterceptors'。雖然我在教程中做了如下的定義:myApp.config(['$ routeProvider',function($ routeProvider,$ locationProvider,$ httpProvider){ 但是不管怎麼樣,你對我的新方法有什麼看法?這是不是認爲是好的? – Moody

+0

@JustLearning應該有'interceptors.push('myHttpInterceptor');',看看我的更新在回答 –

相關問題