我在我的应用程序中检测会话丢失(服务器发送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)
原文链接:https://www.f2er.com/angularjs/145393.html(语法可能不是最好的,因为我是新的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'); });