<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>前端存储 on Last Stand</title><link>https://amatsuzero.github.io/LastStand/tags/%E5%89%8D%E7%AB%AF%E5%AD%98%E5%82%A8/</link><description>Recent content in 前端存储 on Last Stand</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Fri, 08 Nov 2024 00:00:00 +0800</lastBuildDate><atom:link href="https://amatsuzero.github.io/LastStand/tags/%E5%89%8D%E7%AB%AF%E5%AD%98%E5%82%A8/index.xml" rel="self" type="application/rss+xml"/><item><title>前端存储</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/javascript/javascript-025/</link><pubDate>Tue, 01 Oct 2024 00:00:00 +0800</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/javascript/javascript-025/</guid><description>&lt;h2 id="什么是前端存储"&gt;什么是前端存储&lt;/h2&gt;
&lt;p&gt;开门见山。前端存储就是通过前端技术来存储一段信息，然后在同源下的不同页面中都可以获取到已存储信息的一种策略。&lt;/p&gt;
&lt;h2 id="前端存储的作用"&gt;前端存储的作用&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;方便网页的加载，避免了在发送请求收到响应前页面的空白期&lt;/li&gt;
&lt;li&gt;可以在非强制性要求实时更新时减少向服务端的请求，加快渲染速度&lt;/li&gt;
&lt;li&gt;在网络不佳或无网时仍有离线数据可以查看&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="有哪些前端存储方案"&gt;有哪些前端存储方案&lt;/h2&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://amatsuzero.github.io/LastStand/posts/frontend/javascript/javascript-025/image-01.webp"&gt;&lt;/p&gt;
&lt;p&gt;如图，一共有5种前端存储方案。大致可以分为3类：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Cookie&lt;/li&gt;
&lt;li&gt;WebStorage：LocalStorage、SessionStorage&lt;/li&gt;
&lt;li&gt;数据库存储：IndexedDB、WebSQL&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;先做一个简单对比：&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://amatsuzero.github.io/LastStand/posts/frontend/javascript/javascript-025/image-02.webp"&gt;&lt;/p&gt;
&lt;p&gt;下面我们详细介绍。&lt;/p&gt;
&lt;h2 id="cookie"&gt;Cookie&lt;/h2&gt;
&lt;p&gt;Cookie 的工作流程：&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://amatsuzero.github.io/LastStand/posts/frontend/javascript/javascript-025/image-03.webp"&gt;&lt;/p&gt;
&lt;p&gt;Cookie 的构成：&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://amatsuzero.github.io/LastStand/posts/frontend/javascript/javascript-025/image-04.webp"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://amatsuzero.github.io/LastStand/posts/frontend/javascript/javascript-025/image-05.webp"&gt;&lt;/p&gt;
&lt;p&gt;域、路径、失效时间和安全性都是服务器给浏览器的指示，它们不会随着请求发送给服务器，&lt;strong&gt;发送给服务器的只有名称与值的键值对&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;Cookie 的生命周期：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;如果设定了 Cookie 的过期时间，那么 Cookie 会在到期时自动失效&lt;/li&gt;
&lt;li&gt;如果没有设定过期时间，那么 Cookie 就是 session 级别的，即浏览器关闭时 Cookie 自动消失&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Cookie 的优缺点：&lt;/p&gt;
&lt;p&gt;优点：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;可以控制过期时间，不会永久有效，有一定的安全保障&lt;/li&gt;
&lt;li&gt;可进行扩展，可跨域共享&lt;/li&gt;
&lt;li&gt;通过加密与安全传输技术，可以减少 Cookie 被破解的可能性&lt;/li&gt;
&lt;li&gt;有较高的兼容性&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;缺点：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;存储大小最多4KB&lt;/li&gt;
&lt;li&gt;存储数量根据浏览器或浏览器版本的不同而不同，并且每个域最多20条&lt;/li&gt;
&lt;li&gt;请求头上的数据容易被拦截攻击&lt;/li&gt;
&lt;li&gt;存储的数据只能是字符串类型&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;操作 Cookie：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// 设置 Cookie
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Cookie 值必须是字符串类型，并且不支持分号、逗号以及空格，
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// 所以有时需要先使用 encodeURIComponent() 进行编码，或者使用 JSON.stringify() 进行序列化
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;document.&lt;span style="color:#a6e22e"&gt;cookie&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;键1=值1;键2=值2;键n=值n&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// 读取 Cookie
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// 有时需要使用 decodeURIComponent() 或者 JSON.parse()
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;document.&lt;span style="color:#a6e22e"&gt;cookie&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// 修改 Cookie
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// 如果键不存在，就新增；否则就修改
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;document.&lt;span style="color:#a6e22e"&gt;cookie&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;已经存储过的键=新值&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// 删除 Cookie
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;document.&lt;span style="color:#a6e22e"&gt;cookie&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;要删除的键=任意值;max-age=0&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="webstorage"&gt;WebStorage&lt;/h2&gt;
&lt;p&gt;WebStorage 是 HTML5 新加的，WebStorage（Web 存储） 分为 LocalStorage（本地存储） 和 SessionStorage（会话存储）。&lt;/p&gt;</description></item></channel></rss>