Javascript $http侦听器:身份验证失败时重定向
我从web上复制了以下代码以使用JWT授权,但它不起作用。尤其是Javascript $http侦听器:身份验证失败时重定向,javascript,angularjs,angular-ui-router,Javascript,Angularjs,Angular Ui Router,我从web上复制了以下代码以使用JWT授权,但它不起作用。尤其是$location.path命令没有影响-重定向不会发生。我还尝试了$state.go,但这导致了更大的错误。我不完全理解$q在这里指的是什么,不是什么在等待承诺解除,而是问题是$location.path没有将用户带回登录屏幕(下面关于$state更改的建议也没有) 为了进行测试,我发送了一条创建服务器错误的消息,在返回的过程中在devtools中捕获该错误,然后手动设置response.status=403。重定向已明确解析,但
$location.path
命令没有影响-重定向不会发生。我还尝试了$state.go
,但这导致了更大的错误。我不完全理解$q
在这里指的是什么,不是什么在等待承诺解除,而是问题是$location.path
没有将用户带回登录屏幕(下面关于$state
更改的建议也没有)
为了进行测试,我发送了一条创建服务器错误的消息,在返回的过程中在devtools中捕获该错误,然后手动设置response.status=403
。重定向已明确解析,但不会导致重定向。我可以看到登录屏幕被放回屏幕上,但随后立即被另一个视图覆盖
这是工厂$HTTPAjax请求我在这里使用的延迟的
是否可能会干扰拦截器中的设置?
$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;
在这里利用ui路由器不应该有问题。您需要使用
$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
,导致在$httpProvider
中循环引用$http
而导致的循环依赖性(在您的拦截器中似乎还未出现任何注入签名)不确定是否要使用,但这可能会重定向:
$window.location.href = url;
看起来您需要在$location.path('/');
之后运行摘要循环,然后执行$scope.$apply()
不要这样想,因为$scope
无法从.config
方法访问。这是我的错。。你应该这样做$rootScope
。要获得$rootScope
你需要在函数中添加$injector
依赖项,然后在responseError
函数中你可以使用var rootScope=$injector.get(“$rootScope”);$location.path(“/”);rootScope.apply()
我收到一个错误,说明摘要已经在进行中。由于这都是$http的一部分,我认为现在不需要$apply没有错误,但也可以重定向。我在原始问题中添加了更多代码,以查看是否有其他错误interference@SimonH您是否点击了console.log(“app.js:…
?…尝试将.go()
替换为(“$state”)。转换为('login'));
是,正在点击控制台.log
,但是重定向没有发生,服务器错误通过第二个代码中的.error
函数传回原始页面snippet@SimonH该死……我画的是空白。我不明白为什么州政府没有为你过渡。你能告诉我你的发现吗另外,尝试绑定到中的$stateChangeError
。运行块以查看是否可以找到其他内容,例如$rootScope.$on(“$stateChangeError”,函数(事件、toState、toParams、fromState、fromParams、error){…})
好的,我找到了。当我得到e401代码时,我没有删除足够的授权信息,所以我的授权视图的控制器再次自动将我重新登录-呸!
$window.location.href = url;