2013-09-06 11 views
14

Ich bin sehr Neuling in AngularJS, und jetzt verbringen 3 Tage in der Suche nach einer Möglichkeit, 401-Status zu behandeln. Ich habe versucht Interceptors mit $ http, mit $ Ressource ... aber nichts funktioniert. Meine App ruft den JSONP-Anruf auf demselben Server an. Wenn ein Fehler auftritt, wird er in der Fehlerrückruffunktion abgefangen. aber der Status ist immer 0 und die Antwort ist nicht definiert.401 nicht autorisierte Fehlerbehandlung in AngularJS

Zuerst habe ich versucht, diese Abfangjäger

app.config(['$httpProvider', function($httpProvider) { 
$httpProvider.responseInterceptors.push(['$q', function($q) { 
    return function(promise) { 
     return promise.then(function(response) { 
      console.log('success in interceptor'); 
      return response; 
     }, function(response) { 
      console.log('error in interceptor'); 
      console.log(response); 
      if (response.status === 401) { 
       response.data = { 
        status: false, 
        description: 'Authentication required!' 
       }; 
       return response; 
      } 
      return $q.reject(response); 
     }); 
    } 
}]); 
}]); 

Zweitens auch in Controller versucht $ resource mit

$scope.fetchData = function(fromDate, toDate){ 
     Cancel.get({from: fromDate, to: toDate, perPage: 99999}, 
        function(data){        
         $scope.cancels = $scope.filteredCancels = data.data; 
         $scope.search(); 
        }, 
        function(response) { 
         $scope.errorMessage = '<h4>Error : '+response.status+'</h4>'; 
         window.location = "/"; 
        });    
     }; 

Drittens versucht $ http statt $ Ressource mit

$scope.fetchData = function(fromDate, toDate){ 
    $http.jsonp('http://host:8900/api/cancellations?callback=JSON_CALLBACK') 
     .success(function(data, status, headers, config) { 
      console.log(status); 
      }) 
     .error(function(data, status, headers, config) { 
      console.log(status);    
      }; 

Hier finden Sie Informationen zum Header für den JSONP-Aufruf

Request URL:http://host:8900/api/cancellations?callback=angular.callbacks._0 
Request Method:GET 
Status Code:401 Unauthorized 
Request Headersview source 
Accept:*/* 
Accept-Charset:ISO-8859-1,utf-8;q=0.7,*;q=0.3 
Accept-Encoding:gzip,deflate,sdch 
Accept-Language:en-GB,en-US;q=0.8,en;q=0.6 
Cache-Control:max-age=0 
Connection:keep-alive 
Cookie:__utma=149207145.339724205.1374885003.1377550245.1378313049.3; __utmc=149207145; __utmz=149207145.1378313049.3.2.utmcsr=cyphersmart.qc3deva.electricmail.com:8900|utmccn=(referral)|utmcmd=referral|utmcct=/; remember_username=elie.kim%40electricmail.com; PHPSESSID=gdoemlp5jltqq62etc5gfuh653; cookie=cookiecheck; __utma=1.789184132.1378340585.1378499390.1378504453.10; __utmb=1.3.10.1378504453; __utmc=1; __utmz=1.1378340585.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none) 
Host:host:8900 
Referer:http://host:8900/reports/cancels/ 
User-Agent:Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Ubuntu Chromium/25.0.1364.160 Chrome/25.0.1364.160 Safari/537.22 
Query String Parametersview sourceview URL encoded 
callback:angular.callbacks._0 
Response Headersview source 
Cache-Control:no-store, no-cache, must-revalidate, post-check=0, pre-check=0 
Connection:keep-alive 
Content-Type:application/json; charset=utf-8 
Date:Fri, 06 Sep 2013 22:02:13 GMT 
Expires:Thu, 19 Nov 1981 08:52:00 GMT 
Keep-Alive:timeout=20 
Pragma:no-cache 
Server:nginx/0.7.65 
Transfer-Encoding:chunked 

Ich konnte keinen Weg finden, den unbefugten Status 401 zu behandeln, ich band alle die Dinge obwohl. Es würde sehr geschätzt werden, wenn ich einen Tipp oder freundlichen Rat bekomme.

+0

, wenn Sie navigiere zu deiner URL im Browser, was passiert? – akonsu

+0

Welche Version von eckigen verwenden Sie? Dies ist wichtig, da sich die 'responseInterceptors' in 1.2 geändert haben. – TheSharpieOne

+0

@TheSharpieOne meine Version ist v1.0.6. ist es der Grund? –

Antwort

4

ich brauchte sehr ähnlich vor kurzem zu tun, hier ist mein Interceptor

app.factory("HttpErrorInterceptorModule", ["$q", "$rootScope", "$location", 
    function($q, $rootScope, $location) { 
     var success = function(response) { 
      // pass through 
      return response; 
     }, 
      error = function(response) { 
       if(response.status === 401) { 
        // dostuff 
       } 

       return $q.reject(response); 
      }; 

     return function(httpPromise) { 
      return httpPromise.then(success, error); 
     }; 
    } 
]).config(["$httpProvider", 
    function($httpProvider) { 
     $httpProvider.responseInterceptors.push("HttpErrorInterceptorModule"); 
    } 
]); 

für Ihren Anwendungsfall gering modifizierte

2

eine ähnliche Lösung Folgt ...

angular.module('myApp', ['myApp.services', 'myApp.directives'], function ($routeProvider, $locationProvider, $httpProvider, $location) { 

    var httpInterceptor = ['$rootScope', '$q', function (scope, $q) { 

     function success(response) { 
      return response; 
     } 

     function error(response) { 
      var status = response.status; 

      if (status == 401) { 
       $location.url('/login'); 
       return; 
      } 

      return $q.reject(response); 

     } 

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

    }]; 
    $httpProvider.responseInterceptors.push(httpInterceptor); 
}); 
+0

$ httpProvider.interceptors.push ("HttpErrorInterceptorModule"); – Krack

2

Bei Jeder API-Aufruf gibt 401 zurück. Wir müssen den Benutzer zur Anmeldeseite umleiten. Angulas HTTP-Interceptor ist großartig für diesen Job. Wie Sie oben von app.js sehen können, ist es hier Rohr geschoben worden:

httpProvider.responseInterceptors.push('httpInterceptor'); 

Die Interzeptorimplementierung selbst

'use strict'; 

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); 
    }; 
}); 
+0

Wie zeigen Sie dem Benutzer beim Weiterleiten an location.path (/ login) den Grund, warum er ausgeloggt wurde? – maumercado

4

Die akzeptierte Antwort nicht für spätere Versionen von Winkeln funktioniert. Mit 1.5.x (und vielleicht sogar früher) benötigen Sie den Interceptor schreiben anders:

// http interceptor to handle redirection to login on 401 response from API 
app.factory('httpResponseInterceptor', ['$q', '$rootScope', '$location', function($q, $rootScope, $location) { 
    return { 
     responseError: function(rejection) { 
      if (rejection.status === 401) { 
       // Something like below: 
       $location.path('signin/invalidSession'); 
      } 
      return $q.reject(rejection); 
     } 
    }; 
}]); 

Bewerben mit:

app.config(function($httpProvider) { 
    $httpProvider.interceptors.push('httpResponseInterceptor'); 
}); 

Sehen Sie hier für weitere Informationen https://docs.angularjs.org/api/ng/service/ $ http # Abfangjäger