首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP 簡單 Session 管理類:單例模式實現用戶登錄狀態控制

     編輯:PHP 綜合知識

設計目標

封裝原生 $_SESSION 操作,提供:

  • 單例模式確保全局唯一會話管理器
  • 登錄狀態標記(0=未登錄/無效,1=有效用戶)
  • 會話生命週期控制(默認 1 小時)
  • 安全銷毀會話

完整類代碼

<?php
class Session {
    private static $sessionObject;
    private function __construct() {
        // 僅當用戶狀態非 0 時設置 cookie 生命週期
        if (!isset($_SESSION['user']) || $_SESSION['user'] !== 0) {
            session_set_cookie_params(3600); // 1小時
        }
        session_start();
    }
    private function __clone() {} // 禁止克隆

    public static function getObject(): self {
        if (!self::$sessionObject instanceof self) {
            self::$sessionObject = new self();
        }
        return self::$sessionObject;
    }

    public function setFalse(): void {
        $_SESSION['user'] = 0; // 標記無效
    }

    public function setTrue(): void {
        if (isset($_SESSION['user'])) {
            $_SESSION['user'] = 1; // 標記有效
        } else {
            $this->error();
        }
    }

    public function getStatus(): int {
        return $_SESSION['user'] ?? 0;
    }

    public function endSession(): void {
        session_destroy();
    }

    private function error(): void {
        // 可擴展:記錄日誌、拋出異常等
    }
}

使用流程示例

登錄頁

$session = Session::getObject();
// 驗證用戶名密碼通過後
if ($row['password'] === $inputPassword) {
    $session->setTrue();
}

受保護頁面

$session = Session::getObject();
if ($session->getStatus() === 1) {
    // 用戶已登錄,顯示內容
} else {
    // 重定向到登錄頁
    header('Location: login.php');
    exit;
}

登出操作

$session = Session::getObject();
$session->endSession();
header('Location: index.php');

關鍵設計細節

機制實現方式作用
單例模式私有構造函數 + 靜態 getObject()避免重複 session_start(),節省資源
Cookie 生命週期session_set_cookie_params(3600)瀏覽器關閉後 1 小時內免登錄
狀態值設計0=無效/未登錄,1=有效明確語義,避免 null/false 歧義
延遲啟動構造函數中才 session_start()僅在真正需要時啟動會話

安全增強建議

  1. 會話固定攻擊防護:登錄成功後調用 session_regenerate_id(true)
  2. HTTPS 環境:設置 session_set_cookie_params(3600, '/', '', true, true)(Secure + HttpOnly)
  3. 用戶標識綁定:在 $_SESSION['user_id'] 存儲具體用戶 ID,而非僅用 0/1
  4. 閒置超時:結合 $_SESSION['last_activity'] 實現服務端閒置銷毀

擴展方向

當前類僅管理布爾登錄狀態,實際項目建議擴展為:

class Session {
    // ...
    public function setUser(array $userData): void {
        $_SESSION['user'] = 1;
        $_SESSION['user_data'] = $userData; // id, name, roles, permissions...
    }
    public function getUser(): ?array {
        return $this->getStatus() ? ($_SESSION['user_data'] ?? null) : null;
    }
    public function hasRole(string $role): bool {
        $user = $this->getUser();
        return $user && in_array($role, $user['roles'] ?? []);
    }
}
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved