加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

angularjs – 如何在响应拦截器中再次发送请求?

发布时间:2020-12-17 08:31:17 所属栏目:安全 来源:网络整理
导读:我在我的应用程序中检测会话丢失(服务器发送HTTP 419)拦截器。在这种情况下,我需要从服务器请求一个新的会话,然后我想自动发送原始请求。 也许我可以保存请求在请求拦截器,然后再发送,但可能有一个更简单的解决方案。 注意,我必须使用特定的webservice
我在我的应用程序中检测会话丢失(服务器发送HTTP 419)拦截器。在这种情况下,我需要从服务器请求一个新的会话,然后我想自动发送原始请求。
也许我可以保存请求在请求拦截器,然后再发送,但可能有一个更简单的解决方案。

注意,我必须使用特定的webservice来创建会话。

angular.module('myapp',[ 'ngResource' ]).factory(
    'MyInterceptor',function ($q,$rootScope) {
        return function (promise) {
            return promise.then(function (response) {
                // do something on success
                return response;
            },function (response) {
                if(response.status == 419){
                    // session lost
                    // create new session server-side
                    // Session.query();
                    // then send current request again
                    // ???
                }
                return $q.reject(response);
            });
        };
    }).config(function ($httpProvider) {
        $httpProvider.responseInterceptors.push('MyInterceptor');
    });
这里是我的解决方案使用承诺的那些感兴趣。基本上,您需要请求一个新的会话,并等待响应,然后发送对应于原始请求的新请求(使用response.config)。通过返回promise $ http(response.config),您确保响应将被视为是原始请求。
(语法可能不是最好的,因为我是新的promises)
angular.module('myapp',function (response) {
                if(response.status == 419){
                    // session lost
                    var Session = $injector.get('Session');
                    var $http = $injector.get('$http');
                    // first create new session server-side
                    var defer = $q.defer();
                    var promiseSession = defer.promise; 
                    Session.query({},function(){
                        defer.resolve();
                    },function(){
                       // error
                       defer.reject();
                    });       
                    // and chain request
                    var promiseUpdate = promiseSession.then(function(){
                        return $http(response.config);
                    });
                    return promiseUpdate;
                }
                return $q.reject(response);
            });
        };
    }).config(function ($httpProvider) {
        $httpProvider.responseInterceptors.push('MyInterceptor');
    });

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读