AngularJS $http状态码重定向

4

我有一个Angular应用程序,其中有许多$http请求,如果服务器会话过期(获取401),我想将用户重定向到登录页面。是否有人知道适用于所有$http的解决方案,而无需在每个$http上添加.error()

2个回答

4

如果您能使用HTTP拦截器重定向所有检测到的401错误,那将更好。

// add an http interceptor via app.config
app.config(function($$httpProvider) {
    $httpProvider.interceptors.push('my401Detector');
});

// interceptor logic.
app.factory('my401Detector', function($location, $q) {
    return {
        responseError: function(response) {
            if(response.status === 401) {
                 $location.path('/login');
                 return $q.reject(response);
            }
            else {
                return $q.reject(response);
            }
        }
    };
});

1
这真的有效吗?它似乎并没有实际执行完整的页面刷新。https://docs.angularjs.org/guide/$location 还指出:“当浏览器URL改变时,它不会导致完整的页面重新加载。要在更改URL后重新加载页面,请使用较低级别的API $window.location.href。” - comecme

2
您可以使用拦截器来实现这一点。来自Mean.js源代码。
angular.module('users').config(['$httpProvider',
function($httpProvider) {
    // Set the httpProvider "not authorized" interceptor
    $httpProvider.interceptors.push(['$q', '$location', 'Authentication',
        function($q, $location, Authentication) {
            return {
                responseError: function(rejection) {
                    switch (rejection.status) {
                        case 401:
                            // Deauthenticate the global user
                            Authentication.user = null;

                            // Redirect to signin page
                            $location.path('signin');
                            break;
                        case 403:
                            // Add unauthorized behaviour 
                            break;
                    }

                    return $q.reject(rejection);
                }
            };
        }
    ]);
}
 ]);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接