Я скопировал следующий код из Интернета, чтобы работать с авторизацией 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;
похоже, что вам нужно запустить цикл дайджеста после '$ location.path ('/');' then do '$ scope. $ Apply()' –
не думайте, так как '$ scope' недоступен из '.config' –
ohh..thats my bad..you должен сделать это' $ rootScope'..для получения '$ rootScope' вам нужно добавить зависимость' $ injector' в функции, а затем внутри вашей функции 'responseError' вы может использовать 'var rootScope = $ injector.get ('$ rootScope'); $ Location.path ('/'); rootScope. $ apply() ' –