angular jsonp返回状态代码0而不是401

时间:2013-09-18 02:55:49

标签: angularjs

我有一个角度应用程序,它可以调用一个安全的休息端点,并在访问时返回401。我已经在我的应用程序中定义了一个拦截器,以便捕获错误,并且401应用程序应该重定向到登录页面。这听起来非常简单但是当我在浏览器中运行时,我在错误响应中得到状态码0。但是,在我的Chrome控制台中,我可以看到一条日志,其中显示请求的网址为401.

我需要补充一点,JS文件托管在localhost:9000上,而提供401响应的应用程序是在localhost:8080上。有什么问题?

    angular.module('ndbAdminUIApp', ['ngResource']).config(['$routeProvider', '$locationProvider', '$httpProvider', function ($routeProvider, $locationProvider, $httpProvider) {
        $routeProvider.when('/', {
            templateUrl : 'views/main.html',
            controller : 'MainCtrl'
        }).when('/login', {
            templateUrl : 'views/login.html',
            controller : 'LoginCtrl'
        }).otherwise({
            redirectTo : '/'
        });

        var interceptor = ['$location', '$q', function ($location, $q) {
            function success(response) {
                return response;
              }

            function error(response) {
                if (response.status === 401) {
                  $location.path('#login');
                  return $q.reject(response);
                }
                else {
                  return $q.reject(response);
                }
              }

            return function (promise) {
                return promise.then(success, error);
              };
          }];

      $httpProvider.responseInterceptors.push(interceptor);
    }])


    angular.module('ndbAdminUIApp').factory('ndbSystemService', function($http) {
        return {
            heartBeat: function() {
                $http.jsonp('http://localhost\:8080/ndb-service/r/system/hb?callback=JSON_CALLBACK');
              },
          };
      });

2 个答案:

答案 0 :(得分:0)

事实证明,在使用JSONP时,Angular无法真正找出响应代码,而且它不是Angular的错,因为它只是一个函数调用。因此,对于这样做的人来说,唯一的选择是将网页和休息服务放在同一主机上。

答案 1 :(得分:0)

您的服务器响应应该类似于angular.callbacks._0({jsonResponseData})。在您的服务器代码中,您将创建一个响应(基本上是字符串串联)作为响应,而不是发送jsonResponseData。服务器代码大致如下:

var stringForResponse = new StringBuilder();
                stringForResponse.Append(callbackFunctionName);
                stringForResponse.Append("(");
                stringForResponse.Append(jsonResponseData);
                stringForResponse.Append(")");
                toString = stringForResponse.ToString();