angularjs – $location.path无法从http拦截器工作
这是你相当直接的设置,我有一个http拦截器正在寻找401s,如果发现用户被重定向到登录页面:
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’)调用似乎不起作用,路径被完全忽略,我仍然在我的会话到期时我所在的路径(尽管是一个空白页面).一种可能的解决方法是使用传统的window.location =’/#!/ login’;但我觉得这不太理想.我还发现如果我删除返回$q.reject(响应);我得到它的工作,但这引入了另一个错误,其中无法找到响应的数据属性(此处讨论的解决方案:Angular.js $http.post TypeError: Cannot read property ‘data’ of undefined). 我正在跑角1.2.21. 关于可能会发生什么的任何想法?回到window.location不是世界的尽头,但我喜欢这个神秘的一个很好的整洁解决方案:). 提前致谢. 解决方法
我也有同样的问题.
我不确定,但看起来$location.path(…)不会改变位置,因为应用程序等待直到所有的promises将被解析,并且拦截器内的promise被拒绝(返回$q.reject(response);) 在我的情况下,执行http请求的服务放在UI路由器状态的resolve部分内,因此我可以使用$stateChangeError事件来处理错误. 希望这可以帮到你 :) NB我的应用程序的后端返回401响应正文中的自定义错误消息 PS必须有一些更好的解决方案 更新: 更普遍的解决方法: module.config中的拦截器 ... responseError: function (response) { if (response && response.status === 401) { $rootScope.$emit('loginRequired'); } return $q.reject(response); } ... 和事件处理程序在module.run部分的某处 $rootScope.$on('loginRequired',function() { $location.path('/login'); }); (我用$state.go(‘login’)测试了处理程序,但$location.path(‘/ login’);也应该工作:)) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |