jquery ajax方法調用在session超時以後如何跳轉到登錄頁面?

jquery ajax方法調用在session超時以後如何跳轉到登錄頁面?

session超時以後雖然被過濾器過濾到了,但是並不會跳轉到登錄頁面請求具體的解決方法。

我參考了這篇文章,但是我調用ajaxStart不起作用。

http://www.blogjava.net/vickzhu/archive/2009/06/05/280223.html

ext jquery 用戶訪問超時(ext session過期)

解決兩種情況下的用戶訪問超時。
a)普通http請求的session超時。
b)異步http請求的session超時,使用ext後大部分的界面刷新都是異步的ajax請求。

不管是那種類型的http請求總是可以由一個過濾器來捕捉。
分類:普通http請求的header參數中沒有x-requested-with:XMLHttpRequest頭信息,而異步的有。
其實對於常見的ajax框架,header中還有標示自己身份的header信息。

對於普通的http請求,發現session超時後直接重定向到一個超時頁面,顯示訪問超時。
對於異步http請求,發現session超時後則向請求的response中寫入特定的超時頭信息,客戶端ajax對象檢測
頭信息,發現有超時狀態標誌後調用顯示超時信息的javascript方法,提示用戶訪問超時。

服務器端session超時後在過濾器中爲response添加新的頭信息,標記該請求超時:

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.Ajax的requestcomplete事件,每個ajax請求成功後首先響應該事件。在該事件的回調函數裏面判斷
訪問請求是否超時。使用Ext.Ajax對象的好處是,只需要引入一個包含了幾行超時處理代碼的js文件,就可以
爲當前應用增加超時處理功能,原有代碼不需要做任何修改。


使用Ext.Ajaxt對象完成異步請求交互,假如checkUserSessionStatus是你的回調方法,每個頁面引用:

Ext.Ajax.on('requestcomplete',checkUserSessionStatus, this);
function checkUserSessionStatus(conn,response,options){
//Ext重新封裝了response對象
if(typeof response.getResponseHeader.sessionstatus != 'undefined'){
//發現請求超時,退出處理代碼...
}
}
可以利用的幾個特性:a)所有的ajax請求均帶有x-requested-with:XMLHttpRequest頭信息b)Ext.Ajax是單實例對象(非常重要,全局單一Ext.Ajax實例!)c)註冊Ext.Ajax的requestcomplete事件,每個ajax請求成功後首先響應該事件(概念類似spring的aop攔截)。
jquery提供了幾個全局事件可以用來處理session過期請求,如當ajax請求開始時會觸發ajaxStart()方法的回調函數;當ajax請求結束時,會觸發ajaxStop()方法的回調函數。這些方法都是全局的方法,因此無論創建它們的代碼位於何處,只要有ajax請求發生時,都會觸發它們。類似的事件還有:ajaxComplete(),ajaxError(),ajaxSend(),ajaxSuccess()等。
如果使某個ajax請求不受全局方法的影響,那麼可以在使用$.ajax()方法時,將參數中的global設置爲false,jquery代碼如下:$.ajax({ url:"test.html", global:false//不觸發全局ajax事件})
對於其他的ajax框架,解決用戶訪問請求超時這個問題的思路是類似的。


問題補充:
myali88 寫道
這篇文章講的方法可行啦,是不是作者自己的代碼有問題?


java代碼:

當用戶session過期時:

if(request.getHeader("x-requested-with")!=null
&&request.getHeader("x-requested-with").equalsIgnoreCase("XMLHttpRequest")){
PrintWriter printWriter = response.getWriter();
printWriter.print("{sessionState:0}");
printWriter.flush();
printWriter.close();
}

js部分的代碼:

/**
設置jquery的ajax全局請求參數
*/
$.ajaxSetup({
contentType:"application/x-www-form-urlencoded;charset=utf-8",
timeout:5,
cache:false,
complete:function(XMLHttpRequest,textStatus){
var resText=XMLHttpRequest.responseText;
if(resText!=null&&resText!=""){
var res=eval("(" + resText + ")");
if(res.sessionState==0){
window.open(jsContextPath+'/login.jsp','_top');

}


}
}
});

但是這樣在session未過期的時候,ajax請求會導致一些錯誤。

我究竟應該用jquery的哪個方法呢?

問題補充:
myali88 寫道
引用
但是這樣在session未過期的時候,ajax請求會導致一些錯誤。

導致的錯誤是什麼?



找到錯誤了,這句代碼出錯了
var res=eval("(" + resText + ")");
因爲項目中使用了easyui,有些頁面是easyui調用的,整個頁面也認爲是一個ajax請求了,但是整個頁面並不是 json格式。



$.ajaxSetup({
contentType:"application/x-www-form-urlencoded;charset=utf-8",
timeout:pageTimeout,
cache:false
,
complete:function(XHR,TS){
var resText=XHR.responseText;
if(resText=="{sessionState:0}"){
var nav=judgeNavigator();
if(nav.indexOf("IE:6")>-1){
window.opener=null;
window.close();
window.open(jsContextPath+'/login.jsp','');
}else{
window.open(jsContextPath+'/login.jsp','_top');
}
}
}
});


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