gpt4 book ai didi

javascript - AngularJS 中用于管理受限页面的拦截器

转载 作者:行者123 更新时间:2023-11-30 17:22:12 24 4
gpt4 key购买 nike

我几天前才开始使用 AngularJS,我的拦截器在拦截服务器响应的 401 状态时遇到了问题。

当返回 401 并在该事件上触发重定向时,它会广播“loginRequired”类型的消息。

问题是,如果我在未登录的情况下尝试访问受限页面,我会在重定向到登录页面之前看到该页面闪烁片刻。我在异步内容、 promise 等方面仍然是一个初学者。有人可以指出我做错了什么吗?

这是我的拦截器。如您所见,它非常简单,但我将其精简以解释我的观点,并且我试图在进一步开发之前了解一些事情。

拦截器

var services = angular.module('services', []);

services.factory('myInterceptor', ['$q', '$rootScope',
function($q,$rootScope) {

var myInterceptor = {

'responseError': function(rejection) {
$rootScope.$broadcast('event:loginRequired');
return $q.reject(rejection);
}
};

return myInterceptor;
}
]);

我拦截器的注入(inject)

myApp.config(['$httpProvider', function($httpProvider) {
$httpProvider.interceptors.push('myInterceptor');
}]);

受限页面的路由

.when('/restrictedPage', {
templateUrl: 'partials/restrictedPage.html',
controller: 'RestrictedPageController'
}).

受限页面 Controller

controllers.controller('RestrictedPageController', function($scope) {

//Some times the alert pops up, sometimes not.
alert("Damn it I shouldn't be there");

});

$rootScope 事件观察器

$rootScope.$on('event:loginRequired', function() {

//Only redirect if we aren't on free access page
if ($location.path() == "/freeAccess")
return;

//else go to the login page
$location.path('/home').replace();

});

我的问题显然与我处理拦截器和 $q 的方式有关。我在 github 上找到了另一种创建拦截器的方法但这不是官方文档使用的方式,所以我认为这可能是旧的方式,并且在我看来它不如放在工厂里那么干净。在他的模块的配置函数中定义路由后,他只是将这段代码放入。但是这段代码有效,我没有看到页面闪烁。

我在Github上找到的另一种方式

var interceptor = ['$rootScope', '$q', '$log',
function(scope, $q, $log) {

function success(response) {
return response;
}

function error(response) {
var status = response.status;

if (status == 401) {
var deferred = $q.defer();
var req = {
config: response.config,
deferred: deferred
};
scope.$broadcast('event:loginRequired');
return deferred.promise;
}
// otherwise
return $q.reject(response);

}

return function(promise) {
return promise.then(success, error);
};

}
];
$httpProvider.responseInterceptors.push(interceptor);

但我的目标不仅仅是“让它发挥作用”而且我讨厌“如果它没坏就不要修它”这句口头禅。我想了解我的代码有什么问题。谢谢!

最佳答案

不要从拦截器中广播“event:loginRequired”,而是尝试在拦截器中执行位置路径更改。广播会增加接收 401 和更改位置之间的延迟,并且可能是屏幕“闪烁”的原因。

services.factory('myInterceptor', ['$q', '$rootScope', '$location',
function($q, $rootScope, $location) {

var myInterceptor = {

'responseError': function(rejection) {
if (response.status === 401 && $location.path() !== '/freeAccess') {
//else go to the login page
$location.path('/home').replace();
}
// otherwise
return $q.reject(response);
}
};

return myInterceptor;
}
]);

您还可以在应用模块首次运行时执行 HTTP 请求,以立即确定用户是否已获得授权:

myApp.config(['$httpProvider', function($httpProvider) {
$httpProvider.interceptors.push('myInterceptor');
}])
.run(function($http) {
//if this returns 401, your interceptor will be triggered
$http.get('some-endpoint-to-determine-auth');
});

关于javascript - AngularJS 中用于管理受限页面的拦截器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24947909/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com