我在前端使用 angularjs,在后端使用 rails + devise 进行身份验证。
在前端,我添加了一个 responseInterceptor 来重定向到/#/sign_in
来自任何 xhr 请求的任何 401 响应的页面,并使用 toastr 显示咆哮式弹出消息。
App.config(['$httpProvider', function ($httpProvider) {
$httpProvider.responseInterceptors.push('securityInterceptor');
}]);
App.factory('securityInterceptor', ['$injector', '$location', '$cookieStore', function ($injector,$location,$cookieStore) {
return function(promise) {
var $http = $injector.get('$http');
return promise.then(null, function(response){
if (response.status === 401) {
$cookieStore.remove('_angular_devise_user');
toastr.warning('You are logged out');
$location.path('/#/sign_in');
}
});
};
});
我的问题是,当我在控制器初始化期间单击加载多个 xhr 请求的页面时,例如:
var products = Product.query();
var categories = Category.query();
var variations = Variation.query();
这些是各种导航组件所必需的,并且它们都并行触发,从而导致多个重复的咆哮式消息。
有没有办法在第一个 401 上进行角度退出并从拦截器内停止执行控制器的其余部分?在传统的 Rails 应用程序中,会有一个“before_filter”停止常规执行,阻止页面和查询加载......以角度执行此操作的最佳方法是什么?