我已经成功设置了一个 Spring Security 项目,该项目在用户登录时对其进行身份验证。但是,在他登录后,我想通过 Rest Controller 在每个AngularJS 的 Controller 函数。
澄清一下,我如何在每个 Controller 中分别调用以下方法来检索用户对象?
@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 Controller 的开头添加此函数以检索此用户对象并检查它是 null 还是已设置(这样我可以用它做一些逻辑)?
************更新*********** 在 pankajparkar 的建议之后,我现在能够简单地检索用户对象。我直接将 get 方法放在应用程序工厂中:
myApp.factory('accountService', function($http) {
return {
getUser: function() {
return $http.get(urlBase+'/getLoggedInUser');
}
};
});
我可以从每个 Controller 传递 accountService 方法并执行以下操作:
var handleSuccess = function(user, status) {
$scope.user = user;
};
accountService.getUser().success(handleSuccess);
这现在工作正常,我可以像那样在每个 Controller 中获取数据。这个可以吗?或者它能变得更好一点吗?
最佳答案
您可以使用 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
(配置 block )的 Angular 生命周期的配置阶段添加这个拦截器
配置
angular.module('dashboardApp').config(['$httpProvider', function($httpProvider){
$httpProvider.interceptors.push('myHttpInterceptor');
//your other code here like register state & configuration settings
}]);
另请参阅 this link ,这将使您更好地了解如何实现这一点。
关于java - AngularJS 在每次请求时从 Controller 中检索用户对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29625737/