2014-01-29 63 views
0

我使用Apache,PHP,MySQL在localhost框中創建了一個內部web應用程序。PHP會話超時,但AJAX調用仍然有效

用戶正在使用它並在夜間將其在瀏覽器窗口中打開。當他回到應用程序並重新開始使用它時,他直到試圖離開頁面時才收到消息,這很好(並且是理想的),但他所在的頁面有許多AJAX作品,而他能夠使用(調用)ajax頁面,並讓他們出現沒有問題!他認爲自己在做工作,但是當他最終導航到應用程序中的另一個頁面時,它啓動到登錄屏幕,並且他沒有保存任何內容。

只要他呼叫AJAX頁面,我希望應用程序檢查是否存在會話標識,並在沒有找到任何標識的情況下引導回登錄頁面。我怎樣才能做到這一點?

每個AJAX頁面都是它自己的PHP頁面,並且在頁面的最頂部有呼叫session_start();和它們立即在調用自定義函數後,通過查找某個會話變量的存在來檢查用戶是否已登錄。難道這不應該找到會話變化,然後根據需要重定向,或者如果它找不到一個新的會話嘗試創建一個新的會話?

我需要類似session_continue而不是session_start。

這是從具有相關會話信息的php.ini文件摘錄的。

; Whether to use cookies. 
    session.use_cookies = 1 

; Define the probability that the 'garbage collection' process is started 
; on every session initialization. 
; The probability is calculated by using gc_probability/gc_divisor, 
; e.g. 1/100 means there is a 1% chance that the GC process starts 
; on each request. 

session.gc_probability = 1 
session.gc_divisor  = 1000 

; After this number of seconds, stored data will be seen as 'garbage' and 
; cleaned up by the garbage collection process. 
session.gc_maxlifetime = 28888 
+0

如果頁面上有一個Ajax,每個Ajax請求應該重置任何會話超時。如果碰巧會話超時併發生了ajax事件,可能會將它們重定向到ajax請求(最有可能登錄的頁面)上的另一個頁面,並且ajax響應不是預期的那樣會導致javascript中的錯誤停止任何ajax你有計時器。 –

+0

抱歉,只要調用session_start,立即在另一個名爲check_logged_in的函數被調用並且查找$ _SESSION ['logged_in'] = true的存在之後立即更新了這些問題。如果它沒有發現它重定向到登錄頁面。應用程序中的每個頁面都包含該函數以檢查它們是否已登錄。 –

回答

0

相反,不檢查是否老已過期開始一個新的會話,需要發出start_session()之前先檢查。

通過檢查客戶端是否還有會話cookie(通常是PHPSESSION,只要您沒有更改名稱),您可以很容易地完成此操作。一旦過期,當前(最後一個)會話消失,用戶需要重新登錄。

爲了妥善處理這個問題,並總結了上述意見,您首先需要:

  1. 檢查,如果有運行
  2. 檢查,如果正在運行的會話,用戶會話被認證
  3. 檢查,如果該用戶被授予提交當前操作

如果這些檢查中的一個失敗,重定向他到登錄界面。然後,您可以終止任何正在運行的會話,並使用新的會話ID開始新的操作,以擺脫舊數據。

到目前爲止,您在php.ini中所做的只是設置舊會話數據的垃圾回收。這是最後一件事。 「使用cookies」不會處理登錄e.a.爲您的應用程序,目前開放像穀倉門進入任何人(「攻擊」是錯誤的詞)。

+0

這與我想要執行的操作是一致的。你能指出我的任何資源嗎?根據我的PHP.ini文件,我已經在使用會話cookie。 –

+0

'if(empty($ _ COOKIE ['PHPSESSION)){.... logoff ...}' –

+0

我的另一個問題是,在php.ini中,session.cookie_lifetime設置爲0,這意味着它在瀏覽器重啓時過期,而會話垃圾收集最大生命週期設置爲8小時,所以瀏覽器無限期地說,但服務器說8小時。這是問題所在。我應該將這些值設置爲相等的時間嗎? –