解決兩種狀況下的用戶訪問超時:
a)普通http請求的session超時;
b)異步http請求的session超時,若是使用extjs後大部分的界面刷新都是異步的ajax請求。
無論是那種類型的http請求老是能夠由一個過濾器來捕捉。
分類:普通http請求的header參數中沒有x-requested-with:XMLHttpRequest頭信息,而異步的有。
其實對於常見的ajax框架,header中還有標示本身身份的header信息。
對於普通的http請求,發現session超時後直接重定向到一個超時頁面,顯示訪問超時。
對於異步http請求,發現session超時後則向請求的response中寫入特定的超時頭信息,客戶端ajax對象檢測
頭信息,發現有超時狀態標誌後調用顯示超時信息的javascript方法,提示用戶訪問超時。 javascript
服務器端session超時後在過濾器中爲response添加新的頭信息,標記該請求超時: php
if(r.getHeader("x-requested-with")!=null && r.getHeader("x-requested-with").equalsIgnoreCase("XMLHttpRequest")){ response.setHeader("sessionstatus","timeout"); }使用Ext.Ajaxt對象完成異步請求的交互,Ext.Ajax是單實例對象(很是重要,全局單一Ext.Ajax實例!)。
使用Ext.Ajaxt對象完成異步請求交互,假如checkUserSessionStatus是你的回調方法,每一個頁面引用: html
Ext.Ajax.on('requestcomplete',checkUserSessionStatus, this); function checkUserSessionStatus(conn,response,options){ //Ext從新封裝了response對象 if(typeof response.getResponseHeader.sessionstatus != 'undefined'){ //發現請求超時,退出處理代碼... } }能夠利用的幾個特性:
c)註冊Ext.Ajax的requestcomplete事件,每一個ajax請求成功後首先響應該事件(概念相似spring的aop攔截)。 java
jquery提供了幾個全局事件能夠用來處理session過時請求,如當ajax請求開始時會觸發ajaxStart()方法的回調函數; 當ajax請求結束時,會觸發ajaxStop()方法的回調函數。這些方法都是全局的方法,所以不管建立它們的代碼位於何處, 只要有ajax請求發生時,都會觸發它們。相似的事件還有:ajaxComplete(),ajaxError(),ajaxSend(),ajaxSuccess()等。 jquery
$(document).ajaxComplete(function(event,xhr,settings){ if(xhr.responseText=="timeout"){ top.location.href='index.php'; } });
若是使某個ajax請求不受全局方法的影響,那麼能夠在使用$.ajax()方法時,將參數中的global設置爲false,jquery代碼以下: ajax
$.ajax({ url:"test.html", global:false//不觸發全局ajax事件 })
對於其餘的ajax框架,解決用戶訪問請求超時這個問題的思路是相似的。 spring
在這裏推薦一個很實用的Js方法: 服務器
function getRootWin(){ var win = window; while (win != win.parent){ win = win.parent; } return win; }
經過該方法,能夠在一個任意深度的iframe中調用父iframe中的方法。具體到這裏就是不管哪個iframe中的用戶訪問請求超時,均可以經過該方法調用最外層iframe中的退出方法,這樣便爲用戶提供了一個統一的訪問超時退出的UI呈現。 session