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

了解網路儲存

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

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]刪除
最新教學 更多>
  • Java是否允許多種返回類型:仔細研究通用方法?
    Java是否允許多種返回類型:仔細研究通用方法?
    在Java中的多個返回類型:一種誤解類型:在Java編程中揭示,在Java編程中,Peculiar方法簽名可能會出現,可能會出現,使開發人員陷入困境,使開發人員陷入困境。 getResult(string s); ,其中foo是自定義類。該方法聲明似乎擁有兩種返回類型:列表和E。但這確實是如此嗎...
    程式設計 發佈於2025-05-25
  • 如何使用Depimal.parse()中的指數表示法中的數字?
    如何使用Depimal.parse()中的指數表示法中的數字?
    在嘗試使用Decimal.parse(“ 1.2345e-02”中的指數符號表示法表示的字符串時,您可能會遇到錯誤。這是因為默認解析方法無法識別指數符號。 成功解析這樣的字符串,您需要明確指定它代表浮點數。您可以使用numbersTyles.Float樣式進行此操作,如下所示:[&& && && ...
    程式設計 發佈於2025-05-25
  • 如何使用組在MySQL中旋轉數據?
    如何使用組在MySQL中旋轉數據?
    在關係數據庫中使用mySQL組使用mySQL組進行查詢結果,在關係數據庫中使用MySQL組,轉移數據的數據是指重新排列的行和列的重排以增強數據可視化。在這裡,我們面對一個共同的挑戰:使用組的組將數據從基於行的基於列的轉換為基於列。 Let's consider the following ...
    程式設計 發佈於2025-05-25
  • 同實例無需轉儲複製MySQL數據庫方法
    同實例無需轉儲複製MySQL數據庫方法
    在同一實例上複製一個MySQL數據庫而無需轉儲在同一mySQL實例上複製數據庫,而無需創建InterMediate sqql script。以下方法為傳統的轉儲和IMPORT過程提供了更簡單的替代方法。 直接管道數據 MySQL手動概述了一種允許將mysqldump直接輸出到MySQL cli...
    程式設計 發佈於2025-05-25
  • 如何簡化PHP中的JSON解析以獲取多維陣列?
    如何簡化PHP中的JSON解析以獲取多維陣列?
    php 試圖在PHP中解析JSON數據的JSON可能具有挑戰性,尤其是在處理多維數組時。要簡化過程,建議將JSON作為數組而不是對象解析。 執行此操作,將JSON_DECODE函數與第二個參數設置為true:[&&&&& && &&&&& json = JSON = JSON_DECODE($ ...
    程式設計 發佈於2025-05-25
  • 在PHP中如何高效檢測空數組?
    在PHP中如何高效檢測空數組?
    在PHP 中檢查一個空數組可以通過各種方法在PHP中確定一個空數組。如果需要驗證任何數組元素的存在,則PHP的鬆散鍵入允許對數組本身進行直接評估:一種更嚴格的方法涉及使用count()函數: if(count(count($ playerList)=== 0){ //列表為空。 } 對...
    程式設計 發佈於2025-05-25
  • 如何使用Python有效地以相反順序讀取大型文件?
    如何使用Python有效地以相反順序讀取大型文件?
    在python 中,如果您使用一個大文件,並且需要從最後一行讀取其內容,則在第一行到第一行,Python的內置功能可能不合適。這是解決此任務的有效解決方案:反向行讀取器生成器 == ord('\ n'): 緩衝區=緩衝區[:-1] ...
    程式設計 發佈於2025-05-25
  • 解決MySQL插入Emoji時出現的\\"字符串值錯誤\\"異常
    解決MySQL插入Emoji時出現的\\"字符串值錯誤\\"異常
    Resolving Incorrect String Value Exception When Inserting EmojiWhen attempting to insert a string containing emoji characters into a MySQL database us...
    程式設計 發佈於2025-05-25
  • 人臉檢測失敗原因及解決方案:Error -215
    人臉檢測失敗原因及解決方案:Error -215
    錯誤處理:解決“ error:( - 215)!empty()in Function openCv in Function MultSiscale中的“檢測”中的錯誤:在功能檢測中。”當Face Cascade分類器(即面部檢測至關重要的組件)未正確加載時,通常會出現此錯誤。 要解決此問題,必...
    程式設計 發佈於2025-05-25
  • 如何使用PHP從XML文件中有效地檢索屬性值?
    如何使用PHP從XML文件中有效地檢索屬性值?
    從php $xml = simplexml_load_file($file); foreach ($xml->Var[0]->attributes() as $attributeName => $attributeValue) { echo $attributeName,...
    程式設計 發佈於2025-05-25
  • Java字符串非空且非null的有效檢查方法
    Java字符串非空且非null的有效檢查方法
    檢查字符串是否不是null而不是空的 if(str!= null && str.isementy())二手: if(str!= null && str.length()== 0) option 3:trim()。 isement(Isement() trim whitespace whites...
    程式設計 發佈於2025-05-25
  • 切換到MySQLi後CodeIgniter連接MySQL數據庫失敗原因
    切換到MySQLi後CodeIgniter連接MySQL數據庫失敗原因
    Unable to Connect to MySQL Database: Troubleshooting Error MessageWhen attempting to switch from the MySQL driver to the MySQLi driver in CodeIgniter,...
    程式設計 發佈於2025-05-25
  • 如何從Python中的字符串中刪除表情符號:固定常見錯誤的初學者指南?
    如何從Python中的字符串中刪除表情符號:固定常見錯誤的初學者指南?
    從python import codecs import codecs import codecs 導入 text = codecs.decode('這狗\ u0001f602'.encode('utf-8'),'utf-8') 印刷(文字)#帶有...
    程式設計 發佈於2025-05-25
  • 在Oracle SQL中如何提取下劃線前的子字符串?
    在Oracle SQL中如何提取下劃線前的子字符串?
    [ 在oracle sql 解決方案: Explanation:SUBSTR function extracts a substring starting from the specified position (0) and continuing for a specified length.IN...
    程式設計 發佈於2025-05-25
  • 如何高效地在一個事務中插入數據到多個MySQL表?
    如何高效地在一個事務中插入數據到多個MySQL表?
    mySQL插入到多個表中,該數據可能會產生意外的結果。雖然似乎有多個查詢可以解決問題,但將從用戶表的自動信息ID與配置文件表的手動用戶ID相關聯提出了挑戰。 使用Transactions和last_insert_id() 插入用戶(用戶名,密碼)值('test','tes...
    程式設計 發佈於2025-05-25

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

Copyright© 2022 湘ICP备2022001581号-3