2014-08-30 10 views
6

questa è la tua configurazione abbastanza straight-forward, ho un intercettore http che è alla ricerca di 401S, se trovato l'utente viene reindirizzato alla pagina di login:

function($location, $q) 
{ 
    return { 
     request: function (config) { 
      return config || $q.when(config); 
     }, 
     requestError: function(request){ 
      return $q.reject(request); 
     }, 
     response: function (response) { 
      return response || $q.when(response); 
     }, 
     responseError: function (response) 
     { 
      if (response && response.status === 401) 
      { 
       $location.path('/login');      
      } 

      return $q.reject(response); 
     } 
    }; 

} 

Il problema è la chiamata $location.path('/login') non sembra funzionare, il percorso è completamente ignorato e rimango sulla rotta (anche se una pagina vuota) ero su quando scade la mia sessione. Una soluzione possibile è utilizzare il tradizionale window.location = '/#!/login'; ma trovo che sia meno che ideale. Trovo anche che se rimuovo la riga return $q.reject(response);, la faccio funzionare, MA questo introduce un altro errore in cui la proprietà dei dati della risposta non può essere trovata (soluzione discussa qui: Angular.js $http.post TypeError: Cannot read property 'data' of undefined).

Sono in esecuzione angolare 1.2.21.

Qualche idea su cosa potrebbe succedere qui? Tornando a window.location non è la fine del mondo, ma mi piacerebbe una bella soluzione per questo mistero :).

Grazie in anticipo.

+0

Domanda correlata: http://stackoverflow.com/questions/19499323/location-path-doesnt-change-in-a-factory-with-angularjs – Sirozha

risposta

2

Ho lo stesso problema.

non sono sicuro, ma si presenta come $location.path(...) non cambia posizione perché attende app fino a quando tutte le promesse saranno risolti, e la promessa all'interno del intercettore è respinta (return $q.reject(response);)

Nel mio caso il servizio che fa http la richiesta viene inserita nella sezione resolve dello stato del router UI, quindi è possibile utilizzare l'evento $stateChangeError per gestire l'errore. (per ngRoute uso $ routeChangeError evento)

Spero che questo può aiutare :)

NB Il backend dei miei messaggi di errore di ritorno personalizzati app nel corpo 401 risposta

PS Ci deve essere una soluzione migliore

UPDATE:

Più soluzione universale:

intercettore all'interno del module.config

... 
responseError: function (response) { 
    if (response && response.status === 401) { 
     $rootScope.$emit('loginRequired'); 
    } 

    return $q.reject(response); 
} 
... 

e gestore di eventi da qualche parte nella sezione module.run

$rootScope.$on('loginRequired', function() { 
    $location.path('/login'); 
}); 

(ho testato gestore con $state.go('login') ma $location.path('/login'); dovrebbe lavora troppo :))

+0

L'anima simile: http://blog.brunoscopelliti.com/xhr-interceptor -in-an-angularjs-web-app (il dif è che viene utilizzata la callback '.success()') – Sirozha

+0

Il mio codice funziona con $ state.go ('login') ma $ location.path non funziona – windupurnomo

Problemi correlati