ExtJS以及JQuery異步請求Session過時解決方案

ExtJS以及JQuery異步請求Session過時解決方案html

 
最近在開發中遇到這樣的問題,當Session過時後,經過攔截器判斷過時並經過response.sendRedirect(request.getServletContext()+"/login.jsp")重定位到登陸界面,可是由於大部分先後臺的交互是經過Ajax進行的異步請求,這種作法只能是該請求沒有任何的實際相應,可是不能重定位到登陸界面。
 
而後就想能不能對異步請求,在其返回的時候進行統一的前端攔截,判斷若是responseText符合{timeout: true, redirectUri:'/ServletContext/login.jsp'},也就是說timeout爲true則自動重定位到redirectUri對應的頁面。
 
經過網上查找找到以下解決方案:
鑑於一下兩個特性:
一、Ext.Ajax是單實例對象(很是重要,全局單一Ext.Ajax實例!) 
二、註冊Ext.Ajax的requestcomplete事件,每一個ajax請求成功後首先響應該事件(概念相似spring的aop攔截)。
首先在公用的腳本文件裏增長以下兩端內容:
  1.  1 //經過Ext封裝的ajax請示時,默認增長請求頭
     2 //或者可使用全部ajax請求都帶有的x-request-with:XMLHttpRequest頭信息
     3 //若是既有Ext又有Jquery並且要區分處理,則須要這種方式
     4 Ext.Ajax.defaultHeaders = {
     5     'Request-By': 'Ext'    //標識ajax請求
     6 };
     7 //當響應時,自動攔截並判斷若是符合timeout爲true就重定位到redirectUri
     8 Ext.Ajax.on('requestcomplete',checkSessionStatus, this);         
     9 function checkSessionStatus(conn,response,options){
    10     var json = Ext.decode(response.responseText);
    11     if(typeof json == 'object' 
    12         && json.timeout){
    13         Ext.Msg.alert("提示","登入超時,系統將自動跳轉到登錄頁面,請從新登入!",function(){
    14             top.window.location.href = json.redirectUri;
    15         });
    16     }      
    17 } 

     

後臺攔截器進行以下修改:
  1.  1 String vsResuqestBy = request.getHeader("Request-By");
     2 String redirectUri = request.getContextPath() + "/login.jsp";
     3 //若是是Ext的ajax請求則返回響應{"timeout":true,"redirectUri":"/ServletContext/login.jsp"}
     4 //不然,則直接重定爲到login.jsp
     5 if(vsResuqestBy != null && "Ext".endsWith(vsResuqestBy)){
     6     response.getWriter().write("{\"timeout\":true,\"redirectUri\":\""+redirectUri+"\"}");
     7 }
     8 else{
     9     response.sendRedirect(redirectUri);
    10 }  

     

OK,到此問題解決,考慮到還有一個項目是jquery的,因此也順便研究了一下,解決思路以下,只描述出前臺的,後臺跟上面相似,就不贅述了。
前臺Jquery在公共腳本文件中增長:
  1.  1 $.ajaxSetup({
     2     headers: {
     3         'Request-By': 'Jquery'
     4     }
     5 });
     6 
     7 $.ajaxComplete(function(event,xhr,settings){
     8     var json = eval('('+xhr.responseText+')');
     9     if(typeof json == 'object' 
    10         && json.timeout){
    11         alert("登入超時,系統將自動跳轉到登錄頁面,請從新登入!");
    12         top.window.location.href = json.redirectUri;
    13     } 
    14 });

     


本文檔參考了 lym6520 viczhu 的思路,感謝。
    



相關文章
相關標籤/搜索