2011-04-23 110 views
1

我有一個包含公共和私人部分的網站。要訪問私有區域,用戶必須登錄,這會設置會話變量。登錄腳本驗證一切,然後更改了標題位置到私有頁:

//get info from database and if user is authorized, then redirect 
session_start(); 
$_SESSION['authorized'] = $user; 
$_SESSION['firstname'] = $first; 
$_SESSION['lastname'] = $last; 
$_SESSION['password'] = $pass; 
$_SESSION['position'] = $position; 
$_SESSION['email'] = $email; 
header("Location: index2.php"); 

然後index2.php頁面上,我有一個授權檢查頂部:

session_start(); 
if(!isset($_SESSION['authorized'])){ 
header("Location: denied_unauth.php"); 
die(); 
}else{ 
//rest of page 

一切工作像魅力。除了...如果20分鐘內沒有活動,用戶必須重新登錄。Index2.php使用jQuery將div加載到它中,因此用戶永遠不會離開index2.php。如果他們點擊後在不活動的情況下在私人網站上檢索頁面,而不是他們請求的div,他們會收到「已註銷」消息,並再次顯示登錄表單。它與上面列出的腳本完全相同,設置完全相同的會話變量並將它們重定向回到完全相同的頁面(index2.php),這是他們登錄的同一頁面 - 基本上,只是重新加載頁面。

每當我測試這個,index2.php不認識新的會話。它每次都會將用戶發送到「denied_unauth.php」。這告訴我,登錄腳本正在工作,它正在識別用戶名和密碼並將用戶發送到index2.php ...但是當頁面重新加載index2.php時,會話無法識別。我甚至嘗試的情況下,添加一個隨機數到URL的末尾「index2.php somerandomnumber這是一個緩存的問題,但它並沒有幫助

任何想法

編輯:??要我想知道爲什麼,如果在登錄回腳本中創建新的會話變量,在重新加載時不會識別它們會話變量是在他們第一次登錄時創建的,所以我知道腳本的一部分工作,但是當他們在重新登錄後再次返回到頁面時,它不會識別新的$ _SESSION ['授權']。

編輯2:這裏是正在發生的事情:

  1. 從頁面的index.php,用戶登錄時的登錄表單創建一個會話和重定向頭index2.php
  2. 頁index2.php檢查是否會話被設置,如果沒有,則將用戶踢出「拒絕訪問」頁面。
  3. 用戶單擊index2.php頁面中的鏈接可將部分加載到主格
  4. 加載到主格的每個文件都會檢查它是否設置了會話。如果會話存在,則加載文件,如果會話過期,則代替該文件,它會向用戶顯示登錄表單並要求他們重新登錄。(所有這些工作到目前爲止)
  5. 當用戶登錄時從這個表單中創建一組新的會話變量。我已經嘗試設置一個新的會話或session_regenerate_id(),似乎都沒有工作。
  6. 這個新的會話不被index2.php識別,它每次都會把它們踢出去。我已經嘗試在登錄後直接重定向到index2.php,或者只是首先加載他們請求的div,但是這兩種方式,index2.php都沒有看到會話已設置,用戶最終在「拒絕訪問」頁面。
+0

如果這是一個會話生命期問題(我不完全確定我完全理解它),這應該有所幫助:http://stackoverflow.com/questions/1173524/php-session-lifetime-problem – 2011-04-23 13:40:30

+0

@Pekka它應該是一個會話生活中的問題,通過問題的氣味。 – mauris 2011-04-23 13:42:10

回答

0

會話在php中指定了超時。ini文件:

; Lifetime in seconds of cookie or, if 0, until browser is restarted. 
session.cookie_lifetime = 0 

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

; Document expires after n minutes. 
session.cache_expire = 180 

如果你不能或不想在服務器上全局更改,請嘗試在Apache上使用.htaccess文件。

+0

問題不在於我不希望會話過期...這就是我想要的。我希望用戶在閒置一段時間後註銷。問題是,當他們第二次提交登錄表單時,它應該創建一個NEW會話。顯然不是,因爲頁面沒有識別它。爲什麼它會在用戶第一次登錄時創建一個會話,但在註銷並重新登錄後不會創建新會話?這是我需要回答的問題。 – NayDreams 2011-04-23 15:18:21

+0

我還不確定你的意思,對不起。如果你想要一個新的會話用'session_destroy()'殺死當前的會話或者用'session_unset()'取消所有的變量。如果您想同時進行2個會話,請對它們進行不同的命名。 – Francisc 2011-04-23 17:52:39

+0

我沒有將它們註銷,服務器在非活動時間段後自動將其註銷。我設置了變量,檢查它們是否在頁面加載之前設置,並且在大約20分鐘沒有活動之後,服務器再認識會話,以便它們必須重新登錄。在登錄腳本中,我嘗試過都設置新的會話或使用session_regenerate_id(),但是當它嘗試重新加載頁面時,它不會識別會話已設置。 – NayDreams 2011-04-23 18:16:50

0

我不知道它會工作,但如果你沒有訪問您的php.ini或.htaccess文件, 您在session_start()之後,你可能想用這個:

session_regenerate_id(true); 

你也應該把它放在jquery加載div的頁面中。

+0

這聽起來很有希望......這是否會重新創建在用戶因不活動而註銷之前就位的所有會話變量?我在哪裏可以將它放在登錄腳本中,替換(在當前腳本中)創建新會話的行? – NayDreams 2011-04-23 15:21:05

+0

@NayDreams - 是的。它會創建一個新會話,與舊會話相同,除了一件事 - 它的ID。它不僅可以幫助解決您的問題,而且還有助於安全 - 有助於防止會話劫持(如果需要,可以將其谷歌)。我建議把它放在「session_start();」之後,但嘗試玩它。 – T4u 2011-04-23 15:36:46

+0

好的,這沒有奏效......我將login-script中的代碼替換爲重新創建會話變量: session_start(); \t \t \t \t \t \t session_regenerate_id(true); \t print $ page; die(); \t ...當頁面加載時,它仍然因爲未經授權而丟棄我。 – NayDreams 2011-04-23 18:11:52

0

這是會話壽命問題。你可以用兩種方法解決這個問題。這裏的描述:

  1. 更改php.ini文件。增加session.gc_maxlifetime,默認爲1440,即24分鐘。你可以增加這個秒。
  2. 這裏的第二種方式沒有改變php.ini文件。你可以通過使用下面的代碼來設置會話生存時間:

    ini_set('session.gc_maxlifetime',30 * 60);

    session_start();

0

解決這個問題的一個可靠方法是創建一個每隔X分鐘在後臺加載的ajax心跳腳本,只需「觸摸」會話。這期望所有的用戶都可以啓用JavaScript。

0

我終於想通了,並得到它的工作。登錄表單在提交時綁定了jQuery調用,我對其進行了更改,以便新的登錄表單實際執行後調用...並開始工作。