Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angularjs angular jsonp返回状态代码0而不是401_Angularjs - Fatal编程技术网

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

Angularjs angular jsonp返回状态代码0而不是401,angularjs,Angularjs,我有一个angular应用程序,它可以调用一个安全的rest端点,访问时返回401。我已经在我的应用程序中定义了一个拦截器,以便捕获错误,并在401时将应用程序重定向到登录页面。这听起来很简单,但当我在浏览器中运行时,我在错误响应中得到状态代码0。然而,在我的Chrome控制台中,我可以看到一个日志,上面说请求的url导致了401 我需要补充的是,JS文件是在localhost:9000上托管的,而给出401响应的应用程序是在localhost:8080上托管的。怎么了 angular.

我有一个angular应用程序,它可以调用一个安全的rest端点,访问时返回401。我已经在我的应用程序中定义了一个拦截器,以便捕获错误,并在401时将应用程序重定向到登录页面。这听起来很简单,但当我在浏览器中运行时,我在错误响应中得到状态代码0。然而,在我的Chrome控制台中,我可以看到一个日志,上面说请求的url导致了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');
              },
          };
      });

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

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

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

实际上,我在不同的域上使用django和angular编写了一个企业应用程序,并使用httpauth拦截器进行登录检查。它工作得很好。所以这肯定是可以做到的。这很有趣,但要明确的是,你在做jsonp吗?如果你在做post,get和类似的事情,这一切都不会有问题。问题是当您使用jsonp调用时。@Farzad您能详细说明使这不可能的机制吗?我从来没有在我的代码中显式使用过任何JSONP,那么为什么混合使用这个呢?事实上,我只是查找了什么是JSONP。@Stephaneyelbert如果要使用来自不同于承载应用程序的域的数据,则需要使用JSONP。至于为什么Angular不起作用,细节对我来说现在很生疏。这可能是一个角度问题,现在已经解决了。@Farzad我也有同样的问题。我的网页托管在与API不同的主机上。我不使用JSONP。相反,我在web服务器上启用了CORS,但我仍然得到零状态,尽管在Fiddler中,很明显,401正在返回。