jquery ajax方法調(diào)用在session超時(shí)以后如何跳轉(zhuǎn)到登錄頁(yè)面?
session超時(shí)以后雖然被過(guò)濾器過(guò)濾到了,但是并不會(huì)跳轉(zhuǎn)到登錄頁(yè)面請(qǐng)求具體的解決方法。 我參考了這篇文章,但是我調(diào)用ajaxStart不起作用。 http://www./vickzhu/archive/2009/06/05/280223.html ext jquery 用戶訪問(wèn)超時(shí)(ext session過(guò)期) 解決兩種情況下的用戶訪問(wèn)超時(shí)。 a)普通http請(qǐng)求的session超時(shí)。 b)異步http請(qǐng)求的session超時(shí),使用ext后大部分的界面刷新都是異步的ajax請(qǐng)求。 不管是那種類(lèi)型的http請(qǐng)求總是可以由一個(gè)過(guò)濾器來(lái)捕捉。 分類(lèi):普通http請(qǐng)求的header參數(shù)中沒(méi)有x-requested-with:XMLHttpRequest頭信息,而異步的有。 其實(shí)對(duì)于常見(jiàn)的ajax框架,header中還有標(biāo)示自己身份的header信息。 對(duì)于普通的http請(qǐng)求,發(fā)現(xiàn)session超時(shí)后直接重定向到一個(gè)超時(shí)頁(yè)面,顯示訪問(wèn)超時(shí)。 對(duì)于異步http請(qǐng)求,發(fā)現(xiàn)session超時(shí)后則向請(qǐng)求的response中寫(xiě)入特定的超時(shí)頭信息,客戶端ajax對(duì)象檢測(cè) 頭信息,發(fā)現(xiàn)有超時(shí)狀態(tài)標(biāo)志后調(diào)用顯示超時(shí)信息的javascript方法,提示用戶訪問(wèn)超時(shí)。 服務(wù)器端session超時(shí)后在過(guò)濾器中為response添加新的頭信息,標(biāo)記該請(qǐng)求超時(shí): if(r.getHeader("x-requested-with")!=null && r.getHeader("x-requested-with").equalsIgnoreCase("XMLHttpRequest")){ response.setHeader("sessionstatus","timeout"); } 使用Ext.Ajaxt對(duì)象完成異步請(qǐng)求的交互,Ext.Ajax是單實(shí)例對(duì)象(非常重要,全局單一Ext.Ajax實(shí)例!)。 注冊(cè)Ext.Ajax的requestcomplete事件,每個(gè)ajax請(qǐng)求成功后首先響應(yīng)該事件。在該事件的回調(diào)函數(shù)里面判斷 訪問(wèn)請(qǐng)求是否超時(shí)。使用Ext.Ajax對(duì)象的好處是,只需要引入一個(gè)包含了幾行超時(shí)處理代碼的js文件,就可以 為當(dāng)前應(yīng)用增加超時(shí)處理功能,原有代碼不需要做任何修改。 使用Ext.Ajaxt對(duì)象完成異步請(qǐng)求交互,假如checkUserSessionStatus是你的回調(diào)方法,每個(gè)頁(yè)面引用: Ext.Ajax.on('requestcomplete',checkUserSessionStatus, this); function checkUserSessionStatus(conn,response,options){ //Ext重新封裝了response對(duì)象 if(typeof response.getResponseHeader.sessionstatus != 'undefined'){ //發(fā)現(xiàn)請(qǐng)求超時(shí),退出處理代碼... } } 可以利用的幾個(gè)特性:a)所有的ajax請(qǐng)求均帶有x-requested-with:XMLHttpRequest頭信息b)Ext.Ajax是單實(shí)例對(duì)象(非常重要,全局單一Ext.Ajax實(shí)例?。ヽ)注冊(cè)Ext.Ajax的requestcomplete事件,每個(gè)ajax請(qǐng)求成功后首先響應(yīng)該事件(概念類(lèi)似spring的aop攔截)。 jquery提供了幾個(gè)全局事件可以用來(lái)處理session過(guò)期請(qǐng)求,如當(dāng)ajax請(qǐng)求開(kāi)始時(shí)會(huì)觸發(fā)ajaxStart()方法的回調(diào)函數(shù);當(dāng)ajax請(qǐng)求結(jié)束時(shí),會(huì)觸發(fā)ajaxStop()方法的回調(diào)函數(shù)。這些方法都是全局的方法,因此無(wú)論創(chuàng)建它們的代碼位于何處,只要有ajax請(qǐng)求發(fā)生時(shí),都會(huì)觸發(fā)它們。類(lèi)似的事件還有:ajaxComplete(),ajaxError(),ajaxSend(),ajaxSuccess()等。 如果使某個(gè)ajax請(qǐng)求不受全局方法的影響,那么可以在使用$.ajax()方法時(shí),將參數(shù)中的global設(shè)置為false,jquery代碼如下:$.ajax({ url:"test.html", global:false//不觸發(fā)全局ajax事件}) 對(duì)于其他的ajax框架,解決用戶訪問(wèn)請(qǐng)求超時(shí)這個(gè)問(wèn)題的思路是類(lèi)似的。 問(wèn)題補(bǔ)充: myali88 寫(xiě)道 這篇文章講的方法可行啦,是不是作者自己的代碼有問(wèn)題?
java代碼: 當(dāng)用戶session過(guò)期時(shí): 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部分的代碼: /** 設(shè)置jquery的ajax全局請(qǐng)求參數(shù) */ $.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未過(guò)期的時(shí)候,ajax請(qǐng)求會(huì)導(dǎo)致一些錯(cuò)誤。 我究竟應(yīng)該用jquery的哪個(gè)方法呢? 問(wèn)題補(bǔ)充: myali88 寫(xiě)道 引用 但是這樣在session未過(guò)期的時(shí)候,ajax請(qǐng)求會(huì)導(dǎo)致一些錯(cuò)誤。
導(dǎo)致的錯(cuò)誤是什么? 找到錯(cuò)誤了,這句代碼出錯(cuò)了 var res=eval("(" + resText + ")"); 因?yàn)轫?xiàng)目中使用了easyui,有些頁(yè)面是easyui調(diào)用的,整個(gè)頁(yè)面也認(rèn)為是一個(gè)ajax請(qǐng)求了,但是整個(gè)頁(yè)面并不是 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'); } } } }); 這樣就搞定了。 謝謝啦 |
|