AngularJS在每个请求中从控制器检索用户对象

时间:2015-04-14 11:04:12

标签: java angularjs spring spring-mvc

我已经成功设置了一个Spring Security项目,该项目在用户登录时对用户进行身份验证。但是,在他登录后,我希望通过Rest控制器检索每个用户对象(在Spring安全会话中) 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);
})

这样可以打印出firstname,但是当我将上面的方法放在另一个$ http get方法中时,我会遇到一些奇怪的行为。是否有更好的选择或可能性在每个angularjs控制器的开头添加此函数来检索此用户对象并检查它是否为null或设置(所以我可以用它做一些逻辑)?

*********** UPDATE *********** 在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 个答案:

答案 0 :(得分: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,这将为您提供更好的实现方法。