Javascript $http侦听器:身份验证失败时重定向

Javascript $http侦听器:身份验证失败时重定向,javascript,angularjs,angular-ui-router,Javascript,Angularjs,Angular Ui Router,我从web上复制了以下代码以使用JWT授权,但它不起作用。尤其是$location.path命令没有影响-重定向不会发生。我还尝试了$state.go,但这导致了更大的错误。我不完全理解$q在这里指的是什么,不是什么在等待承诺解除,而是问题是$location.path没有将用户带回登录屏幕(下面关于$state更改的建议也没有) 为了进行测试,我发送了一条创建服务器错误的消息,在返回的过程中在devtools中捕获该错误,然后手动设置response.status=403。重定向已明确解析,但

我从web上复制了以下代码以使用JWT授权,但它不起作用。尤其是
$location.path
命令没有影响-重定向不会发生。我还尝试了
$state.go
,但这导致了更大的错误。我不完全理解
$q
在这里指的是什么,不是什么在等待承诺解除,而是问题是
$location.path
没有将用户带回登录屏幕(下面关于
$state
更改的建议也没有)

为了进行测试,我发送了一条创建服务器错误的消息,在返回的过程中在devtools中捕获该错误,然后手动设置
response.status=403
。重定向已明确解析,但不会导致重定向。我可以看到登录屏幕被放回屏幕上,但随后立即被另一个视图覆盖

这是工厂$HTTPAjax请求我在这里使用的
延迟的
是否可能会干扰拦截器中的设置?

    $http(httpObj)
    .success(function (response) {  // returns 0: mongo resto data, 1: wpserver report
        console.log("%s succesful, response: %s", method, response);

        if (!updateNotAdd) {
            Restos.data.restos.push(response[0]);  // add to local copy of data
        } else {
            // replace existing entry with new information
            var idxToReplace = _.findIndex(Restos.data.restos, function(r) {
                return r.qname === resto.qname;
            });
            // copy over all data from editor model to database
            _.assign(Restos.data.restos[idxToReplace], resto);
        }

        var response = {
            success: true,
            id: response[0]._id,
            message: response[1]
        };

        $rootScope.$broadcast("ajaxresponse", response);
        deferred.resolve(response);
    })
    .error(function (msg) {
        // console.log(msg);
        var response = {
            success: false,
            message: msg
        };
        $rootScope.$broadcast("ajaxresponse", response);
        deferred.resolve(response);
    });

    return deferred.promise;

在这里利用ui路由器不应该有问题。您需要使用
$injector
服务获取
$state
服务的参考。观察以下变化

$httpProvider.interceptors.push(function($q, $location, $localStorage, $injector) {
        return {
            'request': function (config) {
                config.headers = config.headers || {};
                if ($localStorage.token) {
                    config.headers.Authorization = 'Bearer ' + $localStorage.token;
                }
                return config;
            },
            'responseError': function(response) {
                if(response.status === 401 || response.status === 403) {
                    console.log("app.js: httpInterceptor caught authorisation status response");
                    delete $localStorage.token;
                    $injector.get('$state').go('login');
                }
                return $q.reject(response);
            }
        };
    });
}

您遇到的更大问题是由于ui路由器将
$http
注入
$TemplateFactory
,导致在
$httpProvider
中循环引用
$http
而导致的循环依赖性(在您的
拦截器中似乎还未出现任何注入签名)

不确定是否要使用,但这可能会重定向:

$window.location.href = url;

看起来您需要在
$location.path('/');
之后运行摘要循环,然后执行
$scope.$apply()
不要这样想,因为
$scope
无法从
.config
方法访问。这是我的错。。你应该这样做
$rootScope
。要获得
$rootScope
你需要在函数中添加
$injector
依赖项,然后在
responseError
函数中你可以使用
var rootScope=$injector.get(“$rootScope”);$location.path(“/”);rootScope.apply()
我收到一个错误,说明摘要已经在进行中。由于这都是$http的一部分,我认为现在不需要$apply没有错误,但也可以重定向。我在原始问题中添加了更多代码,以查看是否有其他错误interference@SimonH您是否点击了
console.log(“app.js:…
?…尝试将
.go()
替换为
(“$state”)。转换为('login'));
是,正在点击
控制台.log
,但是重定向没有发生,服务器错误通过第二个代码中的
.error
函数传回原始页面snippet@SimonH该死……我画的是空白。我不明白为什么州政府没有为你过渡。你能告诉我你的发现吗另外,尝试绑定到
中的
$stateChangeError
。运行
块以查看是否可以找到其他内容,例如
$rootScope.$on(“$stateChangeError”,函数(事件、toState、toParams、fromState、fromParams、error){…})
好的,我找到了。当我得到e401代码时,我没有删除足够的授权信息,所以我的授权视图的控制器再次自动将我重新登录-呸!
$window.location.href = url;