使用jQuery Ajax過濾實現REST不間斷會話

使用jQuery Ajax過濾實現REST不間斷會話

當客戶端與服務端的會話超時,發出一個Ajax數據請求,遇到403狀態碼怎麼辦?
在Shell終端裏,超級管理員會話超時時,會自動顯示密碼輸入確認。對頁面來說,是要捕獲每個狀態碼爲403的失敗請求,待登陸成功後一個個replay,還是在登陸成功後直接刷新頁面?

jQuery發展到今天,應該會提供處理這種業務的功能。果然找到madpilot rants一篇文章,這些問題都迎刃而解。
具體過程是:
當請求遇到403錯誤後,會被放入403隊列,並彈出登陸框,當登陸成功後,會自動重發隊列中未成功的請求。

不過這個方案目前有一定缺陷:它不支持使用Promise風格添加success回調,success回調得寫在options裏面,也就是說:

//支持
jQuery.ajax("/foo.json",{
	success: function(data){
		//TODO
	}
});
//而不支持
jQuery.ajax("/foo.json").done(function(data){
	//TODO
});

以下方案參考了rants的方案,並考慮到了併發請求都403失敗的情形:

require(["jquery"],function($){
	//Thanks @madpilot rants
	//See http://myles.eftos.id.au/blog/2011/11/30/how-to-re-play-an-ajax-request-in-jquery-after-an-authentication-error/#.U-iHifmSx8E
	var isDialogShown=false;
	var ajaxQueue=[];
	jQuery.ajaxSetup({
		statusCode:{
			//未登錄或登陸後session失效時,服務端會返回狀態碼403
			403:function(){
				ajaxQueue.push(this);
				if(isDialogShown){return;}
				isDialogShown=true;
				require(["infrastructure/user/LoginDialog"],function(LoginDialog){
					var dialog=new LoginDialog("loginDialog",{
						onfullfilled:function (){
							isDialogShown=false;
							ajaxQueue.forEach(function(context){
								$.ajax(context);
							});
							ajaxQueue.length=0;
						},
						onrejected:function(){
							
						}
					});
					dialog.placeAt(document.body,"beforeEnd")
					dialog.open();
				});
			}
		}
	});
});


發佈了45 篇原創文章 · 獲贊 21 · 訪問量 21萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章