2014-02-12 127 views
7

我有一個ColdFusion頁面,用戶可以打開模式並查看有關一行數據的更多信息。但是,如果用戶坐在頁面上的時間超過默認的20分鐘會話超時時間,則會發出錯誤,因爲它正在查找會話變量並找不到它們。我理解如何用服務器端代碼來捕獲這個問題,但我似乎無法獲得AJAX調用來成功確定會話是否仍然存在。使用AJAX時檢查會話超時

這裏是AJAX代碼,當用戶點擊按鈕打開模式時觸發。基本上它是檢查會話是否與CFC中的函數存在。我的問題是,它總是返回'有效'。

//this checks if the session is expired 
function checkSessionExists() { 
    $.ajax({ 
     //this is the that has function 
     url: 'components/Admin.cfc', 

     //POST method is used 
     type: "POST", 
     //pass the data   
     data: { 
      method: "checkSessionExists" 
      }, 
     async: false, 
     success: function(response) { 

      //$('#loading').hide(); 
      var obj = $.trim(response); 

      if (obj == 'expired') { //it's never expired 
       alert('Sorry, your session has expired.') 
       window.location.href = "logout.cfm"; 
       return false; 
      } 

      else{ 

      } 
     }, 
     error: function(jqXHR, exception) { 
      alert('Uncaught Error.\n' + jqXHR.responseText); 
     } 
    }); 
return false; 
} 

這裏是在CFC功能:我在想,當我問CFC會話是否存在,它仍然有會話變量,因爲頁面沒有刷新

<cffunction name="checkSessionExists" access="remote" output="false" returntype="string" returnformat="plain" hint="I check if session is expired."> 

    <cfif NOT structKeyExists(session, "alive")> 
     <cfreturn "expired" /> 
    <cfelse> 
     <cfreturn "valid" /> 
    </cfif> 

</cffunction> 

在二十分鐘內。所以...想知道如何將一個AJAX請求發送給CFC並在CFC中有一個函數重新評估會話變量。任何幫助,將不勝感激謝謝!

回答

4

我將取決於您如何設置session.alive值。請記住,只要活動存在於會話中,您的代碼就會返回「有效」。如果在會話初始化代碼中設置session.valid,您將得到您所看到的響應。

對.cfm的任何請求都會導致會話超時值重置爲now()+會話持續時間。我過去曾經使用過這個功能:

  1. 監聽鍵盤或點擊頁面上的事件。如果發生任何此類事件,請設置布爾標誌
  2. 每隔幾分鐘一次,檢查該值併發送ajax調用以保持會話處於活動狀態(如果該值爲true)。然後您將變量設置爲假

然後循環重複。這意味着如果您的用戶正在與網站互動,他們的會話將保持開放,並且在他們正在做的事情結束時不會被拋出。如果您的企業/網站會話政策允許,這可以是一個非常好的設置。

+0

+1你打我10秒;)(我將刪除我的答案,因爲我們基本上是說同樣的事情) –

+1

hehe對不起。如果它不適用於Chrome StackTrack插件,我將無法及時回答任何問題 – barnyr

+0

我必須做類似的事情。我使用了一個像素iframe,對用戶不可見。 Inside是一個帶有元刷新標籤的Coldfusion頁面。請注意,這種方法意味着用戶無需在瀏覽器上執行任何操作。這是故意的。這可能不適合你的情況,但它適用於我的情況。 –