Angularjs 重定向到外部URL

Angularjs 重定向到外部URL,angularjs,angularjs-scope,Angularjs,Angularjs Scope,我正在使用angularJS开发一个web应用程序,但只有身份验证页面不使用angularJS,它只使用html 因此,当用户断开连接时,它必须将其重定向到身份验证页面,因此我制作了一个在任何请求之前执行的拦截器,并使用我的应用程序中的服务来验证用户是否已连接,如果未连接,则必须将其重定向到身份验证页面 这是我的拦截器代码: $httpProvider.interceptors .push(function($q,

我正在使用angularJS开发一个web应用程序,但只有身份验证页面不使用angularJS,它只使用html

因此,当用户断开连接时,它必须将其重定向到身份验证页面,因此我制作了一个在任何请求之前执行的拦截器,并使用我的应用程序中的服务来验证用户是否已连接,如果未连接,则必须将其重定向到身份验证页面

这是我的拦截器代码:

                $httpProvider.interceptors
                        .push(function($q, $injector) {
                            return {
                                'request' : function(request) {
                                        var $http = $injector.get('$http');
/*
calls service from my application to verify the if the user is connected
*/
                                        $http
                                                .get("sessionValidator")
                                                .success(
                                                        function(data) {
                                                            if (data.result == 'sessionNull'
                                                                    || data.role != 'ROLE_USER') {
                                                                window.location.href = '/authenticationPage';
                                                            } 

                                                        });
return request;
                                },
                            };
                        });     

我的问题是调用服务时会生成一个循环(因为这是另一个请求,拦截器将再次执行)。我的问题是否有解决方案,或者是否有其他方法来解决此问题。

因此,根据您的描述和注释,您可以设置一个同时拦截请求和响应的服务。我创建了一个通用的,请参见下面的代码和示例plunker。您可以对代码进行大量扩展,以实现所需的功能

var app = angular.module("myApp", []);

app.service("interceptorService", function($http, $q) {

  // this service only has post and get, but post I documented get
  return {

    get: function(url, parameters){
      var deferred = $q.defer(); // the promise which we will return

      $http.get(url, {params: parameters}).then(function(successResponse){

        // check for null session or role being not a user, and redirect if response is approved
        if (successResponse.data.result == 'sessionNull' || successResponse.data.role != 'ROLE_USER'){
          window.location.href = '/authenticationPage';

          // this should probably be rejected because you don't want to process the response if the person is not a user, also the person is being redirected anyways
          deferred.reject(successResponse);
        } else{
          // since this is successful, we can resolve this successfully
          deferred.resolve(successResponse);
        }

      }, function(failureResponse){

        console.log(failureResponse);
        deferred.reject(failureResponse);


      });
      return deferred.promise;

    },
    post: function(url, parameters){
      var deferred = $q.defer();

      $http.post(url, parameters).then(function(successResponse){
        console.log(successResponse);
        deferred.resolve(successResponse);
      }, function(failureResponse){
        console.log(failureResponse);
        deferred.reject(failureResponse);
      });
      return deferred.promise;

    }
  }
})

app.controller('myCtrl', ['$scope', 'interceptorService', function($scope, interceptorService){

  var url = 'http://api.sba.gov/geodata/city_county_links_for_state_of/tx.xml';
  interceptorService.get(url).then(function(response){
    $scope.result = "http call succeeded";
  }, function(reason){
    $scope.result = "http call failed";
  });

}]); 

这样的拦截器写在响应上,而不是请求上。您可以编写一个响应拦截器并检查
sessionValidator
返回的状态。如果它有错误,只需重定向。这实际上应该在控制器中,您应该创建一个检查用户角色的服务,如果找不到角色,则重定向用户。然后,将服务注入将使用此检查的每个控制器。这不应该在拦截器中。@Chandermani感谢您的回复,但我认为这不是一个好的回复,因为我必须检查用户的角色,所以仅检查响应的状态是不够的,如果不是在请求拦截器中进行的,我在哪里可以调用服务?@EliteOctagon谢谢,但您认为这是最好的解决方案吗,因为我必须在每个控制程序中编写相同的代码?拦截器可以获取依赖项,这意味着只要有服务在执行,您就可以检查拦截器中的任何内容。