2013-03-12 73 views
1

我是一名PHP初學者。我設法創建了一個用戶註冊/註冊系統,該系統導致儀表盤面板。用戶使用會話登錄。如果用戶變爲活動狀態,過期前激活會話

我做了一個會話時間腳本也使會話過了30分鐘後過期。但我的問題是,如果只有當用戶處於非活動狀態時纔會使其到期,並且如果用戶突然激活,如何防止其過期。

這是我的登錄代碼和儀表板代碼。請幫助我。編碼的幫助將不勝感激。

謝謝

#登入碼

$_SESSION['username'] = $username; 
    $_SESSION['emailAddress'] = $email; 
    $_SESSION['LoggedIn'] = 1; 
    $_SESSION['start'] = time(); // taking now logged in time 
    $_SESSION['expire'] = $_SESSION['start'] + (1 * 10) ; 

    header('Location: ../dashboard/'); 

#儀表板CODE

session_start(); 



if(empty($_SESSION['LoggedIn']) && empty($_SESSION['username'])) 
{ 


      echo "<script>location.href='session-expired.php'</script>"; 

} 
    elseif(!isset($_SESSION['LoggedIn']) && !isset($_SESSION['username'])) 
{ 
    echo "<script>location.href='session-expired.php'</script>"; 

} 
else 
{ 

    $now = time(); 

    if($now > $_SESSION['expire']) 
    { 
     session_destroy(); 
     echo "<script>location.href='session-expired.php'</script>"; 
    } 

    else 
    { 


?> 

<!-- After all the html codes --!> 


<?php 
} 
} 
?> 

回答

0

我會建議你閱讀的優秀迴應這個問題:How do I expire a PHP session after 30 minutes?

但是總結一下這個問題的意見(實際上回答你的問題):

不要相信PHP的ini配置,自動到期不會在每個請求上運行,並且您不希望它(它貫穿磁盤上的每個會話,而不僅僅是當前的會話)。

不要從開始時間更新$_SESSION['expire']值。從當前時間更新它。這使它更接近「不活動時期」的實際行爲。

當代碼結束時,您應該始終使用dieexit。當您執行重定向時,您已決定當前頁面已完成,並且您希望不同的頁面接管當前請求。

儘量不要使用<script>location.href=</script>進行重定向。您應該堅持在登錄代碼中使用的服務器端重定向,如下所示:header('Location: ../dashboard/');。有幾個原因。

  • 在開始放置輸出之前,您應該嘗試完成所有準備工作(sesssions,請求處理等)。輸出是echoprintdumps<?php ?>標記之外的任何內容。這些都將數據發送到客戶端,一旦啓動,您無法在服務器上執行某些操作。這導致了php開發人員遇到的一個非常常見的問題"headers already sent"
  • 使用服務器端重定向設置適當的HTTP response code。使用JavaScript不會。所有瀏覽器都支持HTTP - 這就是瀏覽器 - 但並非全部都是browsers support javascript。此外,即使用戶的瀏覽器支持JavaScript,用戶也可能會在您的/未知網站上完全阻止JavaScript。Javascript是enhance websites的絕佳方式,但如果您依賴它來實現關鍵功能,則可能會導致漏洞影響您的用戶甚至是您的網站(如果您在JavaScript中放棄了過多的網站內部工作,無論你做什麼,客戶都可以完全訪問它)。 Don't trust the client.

爲[session_destroy][8]的文檔有這樣一段話:

爲了完全終止會話,想註銷用戶,會話ID也必須給予取消。如果使用cookie傳播會話標識(默認行爲),則必須刪除會話cookie。 setcookie()可用於此目的。

他們幫倒忙沒有詳細介紹如何取消設置會話ID,但它是這樣的:

session_start(); 
session_unset(); 
session_destroy(); 
session_write_close(); 
// if using coookies 
setcookie(session_name(),'',0,'/'); 
session_regenerate_id(true); 

所以,我會爲你#儀表板CODE

session_start(); 
if(!isset($_SESSION['LoggedIn']) || empty($_SESSION['LoggedIn']) || !isset($_SESSION['username'] || empty($_SESSION['username'])) 
{    
    header("Location: /session-expired.php"); 
    exit(); 
} 
else 
{ 
    $now = time(); 
    if($now > $_SESSION['expire']) 
    { 
     session_start(); 
     session_unset(); 
     session_destroy(); 
     session_write_close(); 
     // if using coookies 
     setcookie(session_name(),'',0,'/'); 
     session_regenerate_id(true); 
     header("Locaiton: /session-expired.php"); 
     exit(); 
    } 
    else 
    { 
     $_SESSION['expire'] = $now + 10; 
    } 
} 
做到這一點

另請參見:

  • 您可以將初始檢查合併爲未登錄,因爲他們最初是這樣做的。
  • 你有10秒的會話到期。很低,你可能是爲了測試而做的,但我想我會指出time()使用秒,因爲你提到你是PHP的新手。
  • time()也處理Unix時代,所以請留意year 2038
+0

哇,謝謝你PatricK。解釋非常好。 是的,我把它設置爲10秒進行測試。 – 2013-03-12 04:22:26

1

如果用戶被激活,那麼他/她將再度創出頁面,那就是當你想要移動會話到期時間。如果您的包含文件是由所需的頁面使用的(例如包含標題),則可以將這些行放入這些包含的行中。

+0

謝謝,這有很大的幫助。 – 2013-03-12 01:21:49

+0

不客氣。如果解決了這個問題,請您將答案標記爲已接受? – 2013-03-12 01:23:01

+0

是的,工作..謝謝你... – 2013-03-12 01:27:56