QueenieCplusplus / Backend_Script_Session_Cookie

Home Page:https://github.com/QueenieCplusplus/QuickGoThru/blob/master/README.md#backend-溫故-python--php7--nodejs----計畫同步

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Backend_Script_Session_Cookie

Web Server 處理用戶端的 Request 時,伺服器端會找出相應的函數,將結果轉成 html ,傳送並且呈現予用戶端並且中斷這請求和回應的連線。

倘若要紀錄這連線,需要使用 cookie 和 session,用戶端擁有自己的 session,伺服器端會紀錄這些來自客戶們的 session(有利於記憶登入,免於再次登入,紀錄會員的登入次數,和訪問網站的次數)。

Session 其實就是 Cookie,但是不同於客戶端的 cookie,session 是紀錄在伺服器端的(或是從用戶端的瀏覽器記憶體取得),預設的生命週期始於 Browser 開始執行,死亡於 Browser 終止執行,也可由開發者自行定義特定秒數後,需要重新登入的方式。通常伺服器不必自行紀錄 session,然而有些客戶端會禁止伺服器端在用戶端寫入 cookie 亦或是瀏覽器不支援,所以伺服器端要承受負擔,自行紀錄 session,如果想減輕負擔,建議使用客戶端的 cookie 即可,細節原理就是伺服器在用戶端寫入小檔案,是伺服器放在用戶端的記憶體或磁碟中的一識別紀錄(類似叫號的號碼牌),所以如果使用者重複登入網站,伺服器端利用取出客戶端小檔案的識別號碼認得用戶是誰,進而得知用戶端訪問網站的次數。

資安問題的話,用戶端為了避免個資外洩,通常會選擇拒絕寫入伺服器檔案至自己瀏覽器的記憶體和磁碟。至於開發者的設定方式如下:

 setcookie("name", "value", expire: int, path: string, domain: string, secure: bool)
 
 // 命名通常可以省略,但是值一定要寫入,否則 "" 為刪除的意思。
 // 如同食物有包鮮期限,cookie 也會因為開發者設定的秒數而自動消失。
 // 關於網域,伺服器可能同時擁有很多網域,為避免一網域存取另一網域 cookie,需要分開設定。
 // 路徑為根目錄,識別檔案存放在用戶端的存放路徑。
 
   setcookie("arrayName[0]", "Patty");
   setcookie("arrayName[1]", "Kate");
   setcookie("arrayName[2]", "Queen");
   if(isset($_COOKIE['array_name']))
      foreach($_COOKIE['array_name'] as $key=>$value)
     echo "$key: $vale <BR>";
 
 
  運作方式等同 Session 變數 =>
 
  foreach($_SESSION["購物車品項"] as $key=>$value){ // 使用迴圈顯示各個元素。
                  if(某碼==$key){
                  
                     // if 多做一道驗證,例如數量為 0 則如下行數字為 0
                     $_SESSION["購物車品項"][$key]["數量"] += $_POST["數量"]
                  
                  }
              }

Session 在登入驗證的範例:

session_start();

// Check if the user is already logged in, if yes then redirect him to welcome page
if(isset($_SESSION["loggedin"]) && $_SESSION["loggedin"] === true){
  header("location: welcome.php");
  exit;
}


 // Store data in session variables
      $_SESSION["loggedin"] = true;
      $_SESSION["id"] = $id;
      $_SESSION["username"] = $username;                            

Session 在密碼重設或是申請會員的應用:

session_start();

// Check if the user is logged in, otherwise redirect to login page
if(!isset($_SESSION["loggedin"]) || $_SESSION["loggedin"] !== true){
    header("location: login.php");
    exit;
}

Session 如同 cookie 作為全領變數能存放陣列型態的資料,陣列通常是 DB 的取出物件,是個二維陣列型態的資料。使用方式,可詳見同一母標題的後端腳本類別中的購物車範例:

session_start(); // 通知 php 要使用 session 功能,能幫助伺服器檢查用戶端瀏覽器記憶體或硬碟有無伺服器發送的 SID,如無,則建立一新的 SID,如有,則根據找到的 SID 回復所有變數的值。


if(!empty($_GET["action"])) {

  switch($_GET["action"])){
  
     case "A": // switch 用於『多途決策』, if 用於查核驗證。
        if(!empty($_POST["數量"])){
           if(in_array(某碼, array_key($_SESSION["購物車品項"]))){
              foreach($_SESSION["購物車品項"] as $key=>$value){ //使用迴圈顯示各個元素
                  if(某碼==$key){
                  
                     // if 多做一道驗證,例如數量為 0 則如下行數字為 0
                     $_SESSION["購物車品項"][$key]["數量"] += $_POST["數量"]
                  
                  }
              }
           }
        }
     break;
     case "B":
        if(!empty($_SESSION["購物車品項"])){
            foreach($_SESSION["something"] as $key=>$value) // 此處的 => 即 java 中的 dot 
        
        }
     break;
     case "c":
        unset($_SESSION["購物車品項"]); // 釋放所有 session 變數。
     break;
  }

}

 ....

// 倘若使用者按下了淨空資料,則 ... 金額與數量歸零。

<a id="btnEmpty" href="index.php?action=empty">Clean the Cart Record!</a>
<?php
if(isset($_SESSION["購物車品項"])){
    $total_quantity = 0;
    $total_price = 0;
?>
else {
?>
<div class="no-records">Your Cart is Empty</div>
<?php 
}
?>

// 倘若需要計算總數量與總金額,仍要與 Session 合作。 // 第一則函數為小計 // 第二則函數為總計

   <?php		
    foreach ($_SESSION["購物車品項"] as $item){
    
        $item_price = $item["數量"]*$item["價格"];
        
        }
    ?>
			
	<?php
		$total_quantity += $item["數量"];
		 $total_price += ($item["數量"]*$item["價格"]);
	
	?>

// 單純地秀出商品的編號、品名、照片、金額,邏輯與紀錄 session 無關。

#SID

同一台電腦,倘若分成 safari、chrome、IE 三種瀏覽器登入同一網站,cookie 是不同的!但是同一瀏覽器,不同分頁,則是同一 cookie。

https://bbs.csdn.net/topics/300114707