当前位置: 首页 > 面试题库 >

在angularjs $ http中处理重定向

蒯宇定
2023-03-14
问题内容

我在应用中使用angularjs
http服务,并且在网站上注意到了这一点:

如果AJAX调用成功(服务器发送回200至209之间的HTTP代码),则将执行传递给success()函数的函数。如果AJAX调用失败(除重定向以外的所有其他代码),则执行传递给error()方法的函数。

显然,重定向状态代码既不是成功也不是错误回调的一部分。那么我们将如何处理重定向?

这就是我的脚本所做的,使用http get从服务器获取数据。如果会话到期,则服务器返回 302状态代码 。我应该捕获该状态代码,然后将页面重定向到登录。

app.controller('GraphController', function($scope, $http, localStorageService, $interval) {
        $scope.GraphData = [{"key":"in","values":[]},{"key":"out","values":[]}];

        $scope.pollStats = function() {
            $http.get('/statistics/getStat').success(function(lastData, status, headers) {              
                if (status==302) {
                    //this doesn't work
                    //window.location=headers('Location');
                    //this doesn't work either
                    window.location.replace(headers('Location'));
                }else if (status==200) {
                    ...processData
                }
            });
        };
});

显然,我的脚本无法正常工作,因为成功回调无法处理重定向。那么我们应该如何处理呢?


问题答案:

请注意,这特定于我的项目。

目标 :捕获302状态代码并重定向页面(以我的情况登录)。

结果
:在firebug中,我可以看到响应代码为302,但随后我发现,仅打印status的值(response.status),angularjs就会返回200。所以起初您会以为自己没有希望。但就我而言,我要做的是获取数据(response.data),寻找只能在登录页面中找到的字符串。就是这样。解决的问题:D

这个想法是在这里采取的。

这是代码

app.factory('redirectInterceptor', function($q,$location,$window){
    return  {
        'response':function(response){
        if (typeof response.data === 'string' && response.data.indexOf("My Login Page")>-1) {
            console.log("LOGIN!!");
            console.log(response.data);
            $window.location.href = "/login.html";
            return $q.reject(response);
        }else{
            return response;
        }
        }
    }

    });

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


 类似资料:
  • 问题内容: 我试图弄清楚当我的数据存储在服务中时如何正确处理绑定。 如果将服务放到$ scope中,然后让模板直接绑定到它中,我可以使事情工作,但这似乎是一个糟糕的主意。 我基本上希望拥有它,以便我的视图/控制器能够轻松地将状态更改为服务,并将其反映到各处。 感觉我应该可以执行以下操作,但是不起作用(http://jsfiddle.net/aidankane/AtRVD/1/)。 的HTML JS

  • 问题内容: 当我使用jQuery执行DOM操作(添加新HTML)时,AngularJS不会自动检测新HTML中的变量并将其替换为它们的值。例如: 这是一个简单的例子,但在元素更改HTML(此功能被称为后),输出它仍然不是什么 行 应该在上下文/范围的意思。 问题答案: 您必须注入(http://docs.angularjs.org/api/ng.$compile)并使用它,以便对新html 有所了

  • 问题内容: 我正在将一些数据发布到正在回答302移动临时的服务器上。 我希望HttpClient遵循重定向并自动获取新位置,因为我相信这是HttpClient的默认行为。但是,我得到一个例外,而不是按照重定向:( 这是相关的代码,任何想法都将不胜感激: 问题答案: HttpClient的默认行为符合HTTP规范(RFC 2616)的要求 您可以通过子类化DefaultRedirectStrateg

  • 11.7. 处理重定向 你可以使用两种不同的自定义 URL 头信息来处理永久重定向和临时重定向。 首先, 让我们来看看重定向处理的必要性。 例 11.10. 没有重定向处理的情况下,访问 web 服务 >>> import urllib2, httplib >>> httplib.HTTPConnection.debuglevel = 1 >>> request = url

  • 问题内容: 使用AngularJS“ http get then”结构(应许)时,如何处理HTTP错误,例如500? 问题是,对于任何非200 HTTP响应,都不会调用内部函数。 问题答案: 您需要添加其他参数:

  • 我想知道当从OpenID Connect Endpoint检索JWKS时,Jose4J是否处理重定向超文本传输协议状态代码(例如307)。 我自己现在做检索和传递JWKS给Jose4J所谓的带外。现在,当我切换网络时,我得到了很多307,不知道让Jose4J在支持307和其他重定向状态时进行JWKS检索是否明智 谢谢 简