作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这是您相当直接的设置,我有一个 http 拦截器正在寻找 401,如果找到,用户将被重定向到登录页面:
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);
}
};
}
$location.path('/login')
调用似乎不起作用,路径完全被忽略,我仍然在我的 session 到期时所在的路线上(尽管是空白页)。一种可能的解决方法是使用传统的
window.location = '/#!/login';
但我觉得这不太理想。我还发现,如果我删除
return $q.reject(response);
我让它工作了,但这会引入另一个错误,其中找不到响应的数据属性(此处讨论的解决方案:
Angular.js $http.post TypeError: Cannot read property 'data' of undefined )。
最佳答案
我也有同样的问题。
我不确定,但看起来像 $location.path(...)
不会改变位置,因为 app 会一直等到所有 promise 都被解决,并且拦截器中的 promise 被拒绝( return $q.reject(response);
)
就我而言,执行 http 请求的服务放置在 resolve
中UI路由器状态的部分,所以我可以使用$stateChangeError
事件来处理错误。
(对于 ngRoute 使用 $routeChangeError 事件)
希望这可以帮到你 :)
注意我的应用程序后端在 401 响应正文中返回自定义错误消息
PS一定有更好的解决方案
更新:
更通用的解决方法:
module.config 中的拦截器
...
responseError: function (response) {
if (response && response.status === 401) {
$rootScope.$emit('loginRequired');
}
return $q.reject(response);
}
...
$rootScope.$on('loginRequired', function() {
$location.path('/login');
});
$state.go('login')
测试了处理程序,但
$location.path('/login');
也应该可以工作:))
关于angularjs - $location.path 不适用于 http 拦截器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25579938/
我是一名优秀的程序员,十分优秀!