Ext下,ajax請求和普通http請求,session超時轉到登錄頁面的解決方案


        對於web應用系統,通常會有以下場景:session超時之後,用戶在瀏覽器中發出請求時將作出session超時的判斷,然後系統跳轉到登陸頁面,提示用戶重新登錄。
       問題在於,對於普通的http請求,可以通過攔截器判斷session超時,然後跳轉到登錄頁面;但是對於Ajax請求,則不會如期待的那樣自動轉到登錄頁面,若想實現,必須特殊處理。
      調試中發現,不論是普通http請求還是ajax請求,都可以通過攔截器來將請求捕獲,而且區分這兩種請求在於頭部信息的不同:普通http請求的header參數中沒有x-requested-with:XMLHttpRequest頭信息,而異步的有。

     

       系統是基於ext的ajax框架,通過上網查資料,發現一個比較好的且對原系統改動很小的解決方案:
       首先在session超時後,通過攔截器將ajax請求攔截,爲該請求的設置一個頭部信息以標識其超時;然後,由於Ext.ajax是全局單一ajax實例,因此註冊Ext.Ajax的requestcomplete事件,每個ajax請求成功後首先響應該事件。在該事件的回調函數裏面判斷訪問請求是否超時。使用Ext.Ajax對象的好處是,只需要引入一個包含了幾行超時處理代碼的js文件,就可以爲當前應用增加超時處理功能,原有代碼不需要做任何修改。


這裏,由於系統只是在主窗體上最多彈出兩次窗體,所以在第二級窗體上發出請求時,window.close()並不起作用,彈出的第二級窗體是通過ext渲染到div上的,並非window,但是既然window.close不起作用,說明window對象已不再是指主窗體了,故我猜想,ext框架下,通過div渲染的彈出的窗體,對於ie瀏覽器而言,也是一個JavaScript的window。
如果系統彈出多級窗體,在請求時,還可以調用

來完成窗體的關閉,依據DOM標準,Window.top返回最頂層的先輩窗口,因此可以關閉多級窗體。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章