」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 了解網路儲存

了解網路儲存

發佈於2024-11-07
瀏覽:892

Understanding Web Storage

目录

  • 曲奇饼
  • 本地存储
  • 会话存储
  • 索引数据库
  • 对比分析
  • 安全考虑
  • 结论

介绍

数据存储是现代 Web 应用程序的一个重要方面。无论是保存用户首选项、缓存数据以供离线使用,还是跟踪会话,在浏览器中管理数据的方式都会显着影响用户体验。我们有多种在浏览器中存储数据的选项,每种选项都有自己的优势和用例。在本文中,我们将探讨现代浏览器中可用的不同存储选项,包括本地存储、会话存储、IndexedDB 和 Cookie,并提供有关何时以及如何有效使用它们的见解。


曲奇饼

Cookie 是直接存储在用户浏览器中的小数据片段。它们主要用于跟踪会话、存储用户首选项和管理身份验证。与本地存储和会话存储不同,cookie 会随每个 HTTP 请求发送到服务器,这使得它们适合服务器端操作。

主要特点

  • 容量:每个 cookie 限制为 4 KB。
  • 持久性:Cookie 可以有一个到期日期,使其具有持久性或基于会话。
  • 辅助功能:客户端(通过 JavaScript)和服务器端均可访问。

用法示例:

document.cookie = "username=Mario; expires=Fri, 31 Dec 2024 23:59:59 GMT; path=/"; // Save data

const cookies = document.cookie; // Retrieve data

优点

  • 可用于客户端和服务器端数据存储。
  • 支持持久存储的过期日期。

缺点

  • 存储容量小。
  • 随每个 HTTP 请求一起发送,可能会影响性能。

Cookie 非常适合会话管理、跟踪和处理需要服务器访问的少量数据等任务。


本地存储

本地存储是一种 Web 存储解决方案,允许您在 Web 浏览器中存储键值对,且没有过期时间。这意味着即使关闭并重新打开浏览器后数据仍然存在。本地存储通常用于保存用户首选项、缓存数据和其他需要持久存储的任务。

用法示例:

localStorage.setItem('username', 'Mario'); // Save data

const username = localStorage.getItem('username'); // Retrieve data

localStorage.removeItem('username'); // Remove data

主要特点

  • 简单的API:本地存储提供了一个简单的API来存储和检索数据。
  • 容量:本地存储通常为每个域提供高达 5-10 MB 的存储空间,这比 cookie 大得多。
  • 持久性:存储在本地存储中的数据在浏览器会话中持续存在,直到明确删除。
  • 辅助功能:可通过客户端的 JavaScript 进行访问。

优点

  • 简单的键值对易于使用。
  • 数据在会话中持续存在。

缺点

  • 与 IndexedDB 相比,存储容量有限。
  • 没有内置安全性;页面上的任何脚本都可以访问数据。

会话存储

会话存储与本地存储类似,但有一个关键区别:数据仅在页面会话期间存储。关闭浏览器选项卡后,数据将被清除。这使得会话存储非常适合临时数据存储,例如在浏览多步骤表单时保留表单输入。

用法示例:

sessionStorage.setItem('cart', 'coffee'); // Save data

const cartItem = sessionStorage.getItem('cart'); // Retrieve data

sessionStorage.removeItem('cart'); // Remove data

主要特点

  • 容量:与本地存储类似,存储空间约为5-10 MB。
  • 持久性:数据仅保留到浏览器选项卡关闭为止,但是,它可以在页面重新加载后继续存在。
  • 辅助功能:可通过客户端的 JavaScript 进行访问。

优点

  • 易于用于临时数据。
  • 在会话中保持数据隔离。

缺点

  • 限制会话持续时间,因此不适合长期存储。
  • 与本地存储一样,页面上的任何脚本都可以访问数据,因此它缺乏内置的安全性。

会话存储对于单个会话中的临时数据存储需求特别有用,例如在用户会话期间维护状态,而无需跨会话保留数据。


索引数据库

IndexedDB 是一个低级 API,用于在用户浏览器中存储大量结构化数据,包括文件和 blob。与本地存储和会话存储不同,IndexedDB 是一个成熟的数据库,允许使用查询、事务和索引进行更复杂的数据存储和检索。

主要特点

  • 容量:可以存储大量数据,仅受用户磁盘空间限制。
  • 结构:支持键值对、复杂数据类型、层次结构的结构化数据存储。
  • 辅助功能:异步API,允许非阻塞操作。

用法示例:

const request = indexedDB.open('myDatabase', 1);

request.onupgradeneeded = function(event) {
  const db = event.target.result;
  const objectStore = db.createObjectStore('users', { keyPath: 'id' });
  objectStore.createIndex('name', 'name', { unique: false });
};

request.onsuccess = function(event) {
  const db = event.target.result;
  const transaction = db.transaction(['users'], 'readwrite');
  const objectStore = transaction.objectStore('users');
  objectStore.add({ id: 1, name: 'Mario', age: 30 });
};

优点

  • 大规模、结构化数据存储的理想选择。
  • 支持高级查询和索引。

缺点

  • 与本地存储和会话存储相比,实现起来更复杂。
  • 如果管理不当,异步特性会使代码变得复杂。

IndexedDB适合需要存储和管理大量结构化数据的应用程序,例如支持离线功能的应用程序、复杂的数据操作和更高级的客户端存储需求。


对比分析

选择正确的存储方法取决于您的 Web 应用程序的具体需求。以下是帮助您做出决定的快速比较:

  • Cookies:适合客户端和服务器都需要访问的小块数据,特别是会话管理和跟踪。
  • 本地存储:最适合不需要安全性或大容量的简单、持久的数据存储。非常适合用户偏好或设置。
  • 会话存储:非常适合仅需要在单个会话中保留的临时数据,例如导航期间的表单输入。
  • IndexedDB:存储大量结构化数据的首选选项。它很强大,但也增加了复杂性。

安全考虑

  • Cookies:Secure 和 HttpOnly 标志可以增强安全性。
  • 本地/会话存储:数据可通过 JavaScript 访问,如果处理不当,数据的安全性会降低。
  • IndexedDB:通常是安全的,但如果管理不当,仍然容易受到 XSS 攻击。

选择存储方法时,请考虑数据量、持久性需求、可访问性要求和安全影响。


结论

了解并有效利用不同的 Web 存储选项对于构建强大且用户友好的 Web 应用程序至关重要。每种存储方法(本地存储、会话存储、IndexedDB 和 Cookie)都有其独特的用途并提供独特的优势。根据您的应用需求选择合适的存储解决方案,您可以增强性能、改善用户体验并保证数据安全。

无论您需要简单的持久存储、基于会话的临时存储、复杂的数据管理还是服务器端数据访问,都有适合您要求的存储选项。

版本聲明 本文轉載於:https://dev.to/mario130/understanding-web-storage-j0f?1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>
  • 對象擬合:IE和Edge中的封面失敗,如何修復?
    對象擬合:IE和Edge中的封面失敗,如何修復?
    To resolve this issue, we employ a clever CSS solution that solves the problem:position: absolute;top: 50%;left: 50%;transform: translate(-50%, -50%)...
    程式設計 發佈於2025-04-09
  • 如何使用組在MySQL中旋轉數據?
    如何使用組在MySQL中旋轉數據?
    在關係數據庫中使用mySQL組使用mySQL組進行查詢結果,在關係數據庫中使用MySQL組,轉移數據的數據是指重新排列的行和列的重排以增強數據可視化。在這裡,我們面對一個共同的挑戰:使用組的組將數據從基於行的基於列的轉換為基於列。 Let's consider the following ...
    程式設計 發佈於2025-04-09
  • 為什麼儘管有效代碼,為什麼在PHP中捕獲輸入?
    為什麼儘管有效代碼,為什麼在PHP中捕獲輸入?
    在php ;?>" method="post">The intention is to capture the input from the text box and display it when the submit button is clicked.但是,輸出...
    程式設計 發佈於2025-04-09
  • 如何使用替換指令在GO MOD中解析模塊路徑差異?
    如何使用替換指令在GO MOD中解析模塊路徑差異?
    在使用GO MOD時,在GO MOD 中克服模塊路徑差異時,可能會遇到衝突,其中3個Party Package將另一個PAXPANCE帶有導入式套件之間的另一個軟件包,並在導入式套件之間導入另一個軟件包。如迴聲消息所證明的那樣: go.etcd.io/bbolt [&&&&&&&&&&&&&&&&...
    程式設計 發佈於2025-04-09
  • 如何在其容器中為DIV創建平滑的左右CSS動畫?
    如何在其容器中為DIV創建平滑的左右CSS動畫?
    通用CSS動畫,用於左右運動 ,我們將探索創建一個通用的CSS動畫,以向左和右移動DIV,從而到達其容器的邊緣。該動畫可以應用於具有絕對定位的任何div,無論其未知長度如何。 問題:使用左直接導致瞬時消失 更加流暢的解決方案:混合轉換和左 [並實現平穩的,線性的運動,我們介紹了線性的轉換。...
    程式設計 發佈於2025-04-09
  • 如何從Google API中檢索最新的jQuery庫?
    如何從Google API中檢索最新的jQuery庫?
    從Google APIS 問題中提供的jQuery URL是版本1.2.6。對於檢索最新版本,以前有一種使用特定版本編號的替代方法,它是使用以下語法:獲取最新版本:未壓縮)While these legacy URLs still remain in use, it is recommended ...
    程式設計 發佈於2025-04-09
  • 如何配置Pytesseract以使用數字輸出的單位數字識別?
    如何配置Pytesseract以使用數字輸出的單位數字識別?
    Pytesseract OCR具有單位數字識別和僅數字約束 在pytesseract的上下文中,在配置tesseract以識別單位數字和限制單個數字和限制輸出對數字可能會提出質疑。 To address this issue, we delve into the specifics of Te...
    程式設計 發佈於2025-04-09
  • 如何解決由於Android的內容安全策略而拒絕加載腳本... \”錯誤?
    如何解決由於Android的內容安全策略而拒絕加載腳本... \”錯誤?
    Unveiling the Mystery: Content Security Policy Directive ErrorsEncountering the enigmatic error "Refused to load the script..." when deployi...
    程式設計 發佈於2025-04-09
  • HTML格式標籤
    HTML格式標籤
    HTML 格式化元素 **HTML Formatting is a process of formatting text for better look and feel. HTML provides us ability to format text without us...
    程式設計 發佈於2025-04-09
  • 如何將來自三個MySQL表的數據組合到新表中?
    如何將來自三個MySQL表的數據組合到新表中?
    mysql:從三個表和列的新表創建新表 答案:為了實現這一目標,您可以利用一個3-way Join。 選擇p。 *,d.content作為年齡 來自人為p的人 加入d.person_id = p.id上的d的詳細信息 加入T.Id = d.detail_id的分類法 其中t.taxonomy ...
    程式設計 發佈於2025-04-09
  • 您可以使用CSS在Chrome和Firefox中染色控制台輸出嗎?
    您可以使用CSS在Chrome和Firefox中染色控制台輸出嗎?
    在javascript console 中顯示顏色是可以使用chrome的控制台顯示彩色文本,例如紅色的redors,for for for for錯誤消息? 回答是的,可以使用CSS將顏色添加到Chrome和Firefox中的控制台顯示的消息(版本31或更高版本)中。要實現這一目標,請使用以下...
    程式設計 發佈於2025-04-09
  • 如何為PostgreSQL中的每個唯一標識符有效地檢索最後一行?
    如何為PostgreSQL中的每個唯一標識符有效地檢索最後一行?
    postgresql:為每個唯一標識符提取最後一行,在Postgresql中,您可能需要遇到與在數據庫中的每個不同標識相關的信息中提取信息的情況。考慮以下數據:[ 1 2014-02-01 kjkj 在數據集中的每個唯一ID中檢索最後一行的信息,您可以在操作員上使用Postgres的有效效率: ...
    程式設計 發佈於2025-04-09
  • 如何在php中使用捲髮發送原始帖子請求?
    如何在php中使用捲髮發送原始帖子請求?
    如何使用php 創建請求來發送原始帖子請求,開始使用curl_init()開始初始化curl session。然後,配置以下選項: curlopt_url:請求 [要發送的原始數據指定內容類型,為原始的帖子請求指定身體的內容類型很重要。在這種情況下,它是文本/平原。要執行此操作,請使用包含以下標頭...
    程式設計 發佈於2025-04-09
  • 如何在Java的全屏獨家模式下處理用戶輸入?
    如何在Java的全屏獨家模式下處理用戶輸入?
    在Java 中,以全屏幕獨立模式運行Java應用程序時,通常無法按期望的工作可能無法使用JAVA應用程序時,將用戶輸入在Java ProblemPassive rendering mode allows the use of KeyListener and ActionListener inter...
    程式設計 發佈於2025-04-09
  • 為什麼我在Silverlight Linq查詢中獲得“無法找到查詢模式的實現”錯誤?
    為什麼我在Silverlight Linq查詢中獲得“無法找到查詢模式的實現”錯誤?
    查詢模式實現缺失:解決“無法找到”錯誤在銀光應用程序中,嘗試使用LINQ建立錯誤的數據庫連接的嘗試,無法找到以查詢模式的實現。 ”當省略LINQ名稱空間或查詢類型缺少IEnumerable 實現時,通常會發生此錯誤。 解決問題來驗證該類型的質量是至關重要的。在此特定實例中,tblpersoon可能...
    程式設計 發佈於2025-04-09

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3