java - AngularJS 在每次请求时从 Controller 中检索用户对象

标签 java angularjs spring spring-mvc

我已经成功设置了一个 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/

相关文章:

Java MD5 哪一个是正确的?

AngularJS 表达式连接而不是添加

java - Spring + hibernate : Error bean creation

java - JUnit5 Gradle 插件文件名或扩展名太长

java - Apache Camel 路由不调用处理器

javascript - angular 相当于 angularjs 状态

java - MismatchedTokenException : expecting "set", 发现 '='

java - Spring MVC/Spring Data 数据获取递归

java - Sonar 全局 Java Checkstyle 参数覆盖配置文件

javascript - 如何使用 angularjs 禁用按钮而不更改输入类型复选框的 ng-if 条件?