處理 Cookie

Frontend SELF TW
等級 46 , 課堂 0
開放

5.1 Cookie 的基本特性

Cookie 是一些網站可以儲存在用戶端(用戶的瀏覽器)的小數據片段。它們出現於 localStorage 之前的 20 年,並且一直協助完成其功能。即使在現在,它們仍常常被用於保存會話狀態資訊、用戶偏好設定、追蹤等任務。

Cookie 的基本特性:

  1. 名稱和值 (name=value): 儲存數據的鍵值對。
  2. 網域和路徑 (domain, path): 確定哪些 URL 和網域可使用 Cookie。
  3. 生命週期 (expires, max-age): 確定 Cookie 到期並被刪除的時間。
  4. 安全性 (secure, HttpOnly): 指定如何及何時可傳遞 Cookie。

設置 Cookie

可以使用 JavaScript 或服務端代碼設置 Cookie。在 JavaScript 中使用 document.cookie 屬性。

設置 Cookie 的 JavaScript 範例:

JavaScript
    
      document.cookie = "username=JohnDoe";
    
  

Cookie 的附加參數:

  • expires: 指定 Cookie 到期的日期。超過這個日期,Cookie 將被刪除。
  • path: 定義 Cookie 有效的路徑。通常使用 / 來使得 Cookie 對整個網站有效。
  • domain: 定義 Cookie 有效的網域。
  • secure: 如果設定,Cookie 僅透過 HTTPS 傳遞。
  • HttpOnly: 如果設定,Cookie 不可以通過 JavaScript 訪問(僅服務端可以)。

設置含有附加參數的 Cookie 的範例:

JavaScript
    
      document.cookie = "username=JohnDoe; expires=Fri, 31 Dec 2024 23:59:59 GMT; path=/";
    
  

5.2 管理 Cookie

1. 讀取 Cookie

當前文件的所有 Cookie 都儲存在 一個長串字元 中,即 document.cookie。要獲取 Cookie 的值,需解析這個字串。

讀取 Cookie 的範例:

JavaScript
    
      function getCookie(name) {
        const value = `; ${document.cookie}`;
        const parts = value.split(`; ${name}=`);
        if (parts.length === 2) return parts.pop().split(';').shift();
        return null;
      }

      // 獲取名為 "username" 的 Cookie 的值
      const username = getCookie('username');
      console.log(username); // 輸出: JohnDoe
    
  

2. 更新 Cookie

要更新 Cookie 的值,只需用相同的名稱重新設置,但給出新的值和參數。

更新 Cookie 的範例:

JavaScript
    
      document.cookie = "username=JaneDoe; expires=Fri, 31 Dec 2024 23:59:59 GMT; path=/";
    
  

3. 刪除 Cookie

要刪除 Cookie,需要為其設定一個 過期的有效期

刪除 Cookie 的範例:

JavaScript
    
      // 設定過期的有效期
      document.cookie = "username=JohnDoe; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;";
    
  

5.3 Cookie 操作範例

說明:

  • setCookie: 設置包含名稱、值及生命週期(天數)的 Cookie
  • getCookie: 根據名稱返回 Cookie 值
  • deleteCookie: 根據名稱刪除 Cookie

範例:

HTML
    
      <!DOCTYPE html>
      <html>
        <head>
          <title>Cookie 範例</title>
        </head>
        <body>
          <button onclick="handleSetCookie()">設置 Cookie</button>
          <button onclick="handleGetCookie()">獲取 Cookie</button>
          <button onclick="handleDeleteCookie()">刪除 Cookie</button>

          <script>
            function setCookie(name, value, days) {
              let expires = "";
              if (days) {
                const date = new Date();
                date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
                expires = "; expires=" + date.toUTCString();
              }
              document.cookie = name + "=" + (value || "") + expires + "; path=/";
            }

            function getCookie(name) {
              const nameEQ = name + "=";
              const ca = document.cookie.split(';');
              for (let i = 0; i < ca.length; i++) {
                let c = ca[i].trim();
                if (c.indexOf(nameEQ) === 0) return c.substring(nameEQ.length, c.length);
              }
              return null;
            }

            function deleteCookie(name) {
              document.cookie = name + '=; Max-Age=0; path=/';
            }

            function handleSetCookie() {
              setCookie('username', 'JohnDoe', 7);
              alert('Cookie "username" 設置為 "JohnDoe",有效期7天');
            }

            function handleGetCookie() {
              const cookieValue = getCookie('username');
              if (cookieValue) {
                alert('Cookie "username" 的值為: ' + cookieValue);
              } else {
                alert('找不到 Cookie "username"');
              }
            }

            function handleDeleteCookie() {
              deleteCookie('username');
              alert('Cookie "username" 已刪除');
            }
          </script>
        </body>
      </html>
    
  

5.4 服務端設置 Cookie

了解在服務端(Node.js)中使用 HttpOnly 和 Secure Cookie。

範例:

JavaScript
    
      const express = require('express');
      const app = express();

      app.get('/setcookie', (req, res) => {
        res.cookie('secureServerCookie', 'ServerJohnDoe', {
          maxAge: 7 * 24 * 60 * 60 * 1000, // 7 天
          httpOnly: true,
          secure: true,
          sameSite: 'strict'
        });
        res.send('設置了安全的服務端 Cookie');
      });

      app.get('/getcookie', (req, res) => {
        const cookie = req.cookies.secureServerCookie;
        res.send(`Cookie 值: ${cookie}`);
      });

      app.listen(3000, () => {
        console.log('伺服器正在 3000 埠運行');
      });
    
  

Cookie 的使用範例:

  1. 身份驗證: 常用於保存會話令牌,以驗證用戶的請求。
  2. 用戶偏好: 可以儲存用戶設定,如介面語言或主題。
  3. 用戶追蹤: 可以用於跟蹤用戶在網站上的行為,以進行分析和內容個性化。
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION