vickzhu

            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            151 隨筆 :: 0 文章 :: 34 評論 :: 0 Trackbacks

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

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

          對于普通的http請求,發(fā)現(xiàn)session超時后直接重定向到一個超時頁面,顯示訪問超時。
          對于異步http請求,發(fā)現(xiàn)session超時后則向請求的response中寫入特定的超時頭信息,客戶端ajax對象檢測
          頭信息,發(fā)現(xiàn)有超時狀態(tài)標(biāo)志后調(diào)用顯示超時信息的javascript方法,提示用戶訪問超時。

          服務(wù)器端session超時后在過濾器中為response添加新的頭信息,標(biāo)記該請求超時:

          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請求成功后首先響應(yīng)該事件。在該事件的回調(diào)函數(shù)里面判斷
          訪問請求是否超時。使用Ext.Ajax對象的好處是,只需要引入一個包含了幾行超時處理代碼的js文件,就可以
          為當(dāng)前應(yīng)用增加超時處理功能,原有代碼不需要做任何修改。

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

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


          })

           對于其他的ajax框架,解決用戶訪問請求超時這個問題的思路是類似的。

          在這里推薦一個很實用的Js方法:

          function getRootWin(){
          var win = window;
          while (win != win.parent){
          win = win.parent;
          }
          return win;
          }
          

           

          通過該方法,可以在一個任意深度的iframe中調(diào)用父iframe中的方法。具體到這里就是無論哪一個iframe中的用戶訪

          問請求超時,都可以通過該方法調(diào)用最外層iframe中的退出方法,這樣便為用戶提供了一個統(tǒng)一的訪問超時退出的UI

          呈現(xiàn)。

          posted on 2009-06-05 15:54 筱 筱 閱讀(3483) 評論(0)  編輯  收藏

          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 梧州市| 西平县| 衡阳市| 晋城| 夹江县| 英山县| 烟台市| 德江县| 长顺县| 抚顺市| 隆尧县| 盐源县| 朔州市| 北票市| 龙山县| 若羌县| 通江县| 宣汉县| 翼城县| 洪湖市| 沐川县| 淮北市| 大邑县| 德钦县| 托克逊县| 孙吴县| 商丘市| 新干县| 涪陵区| 黄陵县| 韩城市| 万盛区| 北辰区| 林周县| 延庆县| 兴宁市| 揭东县| 内江市| 彰化县| 濉溪县| 正阳县|