我有一个名为service
的{{1}},它存储了名为loginManager
&的对象。 is_logged_in
以及其他一些人。我的各种控制器使用api_token使用$ http进行ajax调用。
如果api_token在服务器上重置/过期,则响应将以
api_token
发送,此时我设置auth_error
我想要实现的是,每当is_logged_in = false
发生更改时,服务都会使用is_logged_in
重定向到/login
,即我要观看< / strong>服务中的对象,并在服务本身的更改时调用回调。
我只是希望服务能够处理登录和相应的路由,而没有任何控制器担心天气用户是否登录。
答案 0 :(得分:0)
我建议您将该观察者置于角色应用程序的运行阶段,该应用程序将位于一个位置,您可以通过该应用程序检查服务的值is_logged_in
标记。如果用户没有登录,则将他/她直接重定向到登录页面。
<强>代码强>
app.run(function($rootScope, loginManager, $location){
$rootScope.$watch(function(){
return loginManager.is_logged_in;
}, function(newValue){
if(angular.isDefine(newValue) && !newValue)
$location.path('/login');
//$state.go('login'); //if you are using ui.router
})
})
修改强>
你的问题真的好奇的部分是,你正在改变服务的is_logged_in
旗帜,因为@JBNizet问道?如果有任何代码是JavaScript,那么你应该直接从那里重定向到登录页面。
答案 1 :(得分:0)
我相信Pankaj Pakar's答案可行,但你应该使用棱角分明interceptors。他们拦截所有消息。您可以为响应或responseError添加钩子,当您收到auth_error
时,您可以执行任何您喜欢的操作。例如$location.path('/login')
,向用户显示错误等
如果您想要分离逻辑,您可以使用内部所有代码注入您的服务,并在其上调用一些方法。
答案 2 :(得分:0)
我觉得有必要回答更多问题,Mior是对的,但他的回答需要更多的肉。
在这里,我向您展示了如何处理所有服务器XHR请求,并且响应401未经授权。
首先,您需要一项服务:
'use strict';
angular.module('theModule')
.factory('interceptorService', ['$q', '$location', function ($q, $location) {
return {
response: function (response) {
return response || $q.when(response);
},
responseError: function (rejection) {
var returnTo = $location.path().replace(/^\/|\/$/g, '');
if (returnTo === 'login') {
return;
}
if (rejection.status === 401) {
console.log('Unauthorized');
$location.path('/login').search('returnTo', returnTo);
}
return $q.reject(rejection);
}
};
}]);
这将用于拦截所有XHR调用,并在每次发现401错误时更改位置。
我还添加了一个改进,即&#34; returnTo&#34;参数,您可以在登录后使用它返回上一页。
要将它绑定到您必须调用config方法的每个请求,这是我的主要javascript。
'use strict';
/**
* @author Gianmarco Laggia
*
* Main module of the application an configurations.
*/
angular
.module('theModule', [])
.config(['$httpProvider', function ($httpProvider) {
//Http Interceptor to check auth failures for xhr requests
$httpProvider.interceptors.push('interceptorService');
}]);
这几乎是你需要拦截每个请求,处理rejection.status,你也可以拦截事件,如服务器关闭(状态为-1),内部服务器错误(500+),成功状态(在响应部分,状态200+)等。