2015-06-23 2 views
2

Я скопировал следующий код из Интернета, чтобы работать с авторизацией JWT, но он не работает. В частности команда $location.path не имеет никакого влияния - перенаправление не происходит. Я также пробовал с $state.go, но это привело к большим ошибкам. Я не совсем понимаю, о чем говорит $q, а не то, что ждет обещания расслабиться, но проблема $location.path не возвращает пользователя на экран входа в систему (а также ниже приведенные ниже предложения относительно изменений $state).

$httpProvider.interceptors.push(function($q, $location, $localStorage) { 
     return { 
      'request': function (config) { 
       config.headers = config.headers || {}; 
       if ($localStorage.token) { 
        config.headers.Authorization = 'Bearer ' + $localStorage.token; 
       } 
       return config; 
      }, 
      'responseError': function(response) { 
       if(response.status === 401 || response.status === 403) { 
        console.log("app.js: httpInterceptor caught authorisation status response"); 
        delete $localStorage.token; 
        $location.path('/'); // to login page 
        // $state.go('login'); 
       } 
       return $q.reject(response); 
      } 
     }; 
    }); 
} 

Чтобы проверить, я отправить сообщение, которое создает ошибку сервера, поймать, что в Devtools на обратном пути, а затем вручную установить response.status = 403. Перенаправление явно анализируется, но не приводит к перенаправлению. Я вижу, что экран входа в систему помещается обратно на экран, но затем сразу же перезаписывается другим видом.

Это заводской запрос $ http ajax. Возможно ли, что deferred$q Я использую здесь, мешает этому в перехватчике?

$http(httpObj) 
    .success(function (response) { // returns 0: mongo resto data, 1: wpserver report 
     console.log("%s succesful, response: %s", method, response); 

     if (!updateNotAdd) { 
      Restos.data.restos.push(response[0]); // add to local copy of data 
     } else { 
      // replace existing entry with new information 
      var idxToReplace = _.findIndex(Restos.data.restos, function(r) { 
       return r.qname === resto.qname; 
      }); 
      // copy over all data from editor model to database 
      _.assign(Restos.data.restos[idxToReplace], resto); 
     } 

     var response = { 
      success: true, 
      id: response[0]._id, 
      message: response[1] 
     }; 

     $rootScope.$broadcast("ajaxresponse", response); 
     deferred.resolve(response); 
    }) 
    .error(function (msg) { 
     // console.log(msg); 
     var response = { 
      success: false, 
      message: msg 
     }; 
     $rootScope.$broadcast("ajaxresponse", response); 
     deferred.resolve(response); 
    }); 

    return deferred.promise; 
+0

похоже, что вам нужно запустить цикл дайджеста после '$ location.path ('/');' then do '$ scope. $ Apply()' –

+0

не думайте, так как '$ scope' недоступен из '.config' –

+0

ohh..thats my bad..you должен сделать это' $ rootScope'..для получения '$ rootScope' вам нужно добавить зависимость' $ injector' в функции, а затем внутри вашей функции 'responseError' вы может использовать 'var rootScope = $ injector.get ('$ rootScope'); $ Location.path ('/'); rootScope. $ apply() ' –

ответ

3

У вас не должно быть проблем с использованием ui-router здесь. Вам необходимо воспользоваться услугой $injector, чтобы получить ссылку на услугу $state. Обратите внимание на следующие изменения ...

$httpProvider.interceptors.push(function($q, $location, $localStorage, $injector) { 
     return { 
      'request': function (config) { 
       config.headers = config.headers || {}; 
       if ($localStorage.token) { 
        config.headers.Authorization = 'Bearer ' + $localStorage.token; 
       } 
       return config; 
      }, 
      'responseError': function(response) { 
       if(response.status === 401 || response.status === 403) { 
        console.log("app.js: httpInterceptor caught authorisation status response"); 
        delete $localStorage.token; 
        $injector.get('$state').go('login'); 
       } 
       return $q.reject(response); 
      } 
     }; 
    }); 
} 

Чем больше вопросов вы испытывающие вызваны круговой зависимостью в связи с UI-маршрутизатор инъекционного $http в $TemplateFactory - что приводит к циклической ссылке на $http внутри $httpProvider при попытке впрыснуть $state (который еще не кажется, в вашем interceptors инъекции подписи в любом случае)

+0

без ошибок, но перенаправлять также. Я добавил в исходный вопрос еще один код, чтобы узнать, есть ли какие-то другие помехи. –

+0

@SimonH вы попадаете в свой 'console.log (« app.js: ... '? .. Попробуйте поменять' .go() ' for '('$ state'). transitionTo ('login');' – scniro

+0

Да, «console.log» попадает, но перенаправление не происходит, и ошибка сервера возвращается на исходную страницу через функция '.error' во втором фрагменте кода –

0

не уверен, хотите ли вы использовать, но, вероятно, это будет перенаправлять:

$window.location.href = url; 
Смежные вопросы