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

詳解JS瀏覽器儲存

 更新時間:2021年05月06日 14:47:13   作者:淺笑·  
這篇文章主要介紹了JS瀏覽器儲存,對存儲數(shù)據(jù)感興趣的同學(xué),可以參考下

引言

隨著對前端的了解越來越深入,了解到了很多種瀏覽器的存儲方案,如 Cookie、LocalStorage等,哪這些存儲方案有何異同,分別的適用場景又是什么呢。

Cookie

Cookie的來源

Cookie 被創(chuàng)造出來的本意并不是本地儲存,而是為了辨別用戶身份。眾所周知,Http 協(xié)議是無狀態(tài)的,也就是說你每一次發(fā)送給服務(wù)器的請求對于服務(wù)器來說都是孤立的,服務(wù)器不知道這這些請求來自于誰。比如你向購物車?yán)锩嫣砑恿艘恍┥唐罚钱?dāng)發(fā)送結(jié)賬請求的時候服務(wù)器懵了,我怎么知道你是誰,你買了什么呢。而使用 Cookie 之后,服務(wù)器就可以通過查看 Cookie 來判斷發(fā)送用戶,一定程度上 Cookies 可以說是請求的身份證??梢愿嬖V服務(wù)器請求發(fā)送自誰。

Cookie是什么

百聞不如一見,直接來看看 Cookie 長啥樣

這是百度首頁使用的 Cookie ,如你所見,Cookie 是以 Name-Value 鍵值對儲存在瀏覽器中的,其中 Value 又是明顯經(jīng)過了加密的數(shù)據(jù)。

Cookie生成方式

Cookie 是所屬于域名的,還是百度首頁的 Cookie,通過 Domain 屬性可以得知前兩個 Cookie 是屬于 .baidu.com 的

每個域名只能設(shè)置與訪問到自己域名下的 Cookie,比如 baidu.com 無法訪問 Domain 為 sougou.com 的 Cookie。但是子域名可以讀取父域名設(shè)置的Cookie,比如截圖中 www.baidu.com 就讀取到了 Domain='.baidu.com' 的Cookie,通過手動設(shè)置 Domain 可以設(shè)置父域名的 Cookie,比如 www.baidu.com 可以設(shè)置Domain='baidu.com'這樣 *.baidu.com 所有二級域名也能讀取到它設(shè)置的 Cookie

//www.baidu.com

document.cookie='age=20;domain=.baidu.com'

// 此時 所有二級域名可以直接讀取到這個 Cookie

Cookie的生成方式分為 服務(wù)器端生成和瀏覽器端生成。

服務(wù)器端-通過設(shè)置 http response header中的set-cookie

我們可以通過響應(yīng)頭里的 Set-Cookie 指定要存儲的 Cookie 值。當(dāng)請求返回瀏覽器的時候瀏覽器就會按照 header 中的 set-cookie 值設(shè)置 Cookie。默認(rèn)情況下,Domain 被設(shè)置為設(shè)置 Cookie 頁面的主機(jī)名,當(dāng)然我們也可以手動設(shè)置 Domain 的值。

Set-Cookie: id=a3fWa;

瀏覽器端-js中可以通過document.cookie可以讀寫cookie,以鍵值對的形式展示

document.cookie="id=a3fWa"
document.cookie='age=20;domain=.baidu.com'

Cookie的應(yīng)用場景

既然 Cookie 的作用就是告訴服務(wù)器請求來自于誰,那么最主要的作用就是保持用戶登陸態(tài)(記住密碼),除此之外還可以記錄用戶瀏覽數(shù)據(jù),進(jìn)行廣告推送和前文提到的購物車等。

Cookie的缺點

缺點其實在前文中就很顯而易見了

不夠大

Cookie 會隨著每一次請求發(fā)送,這就注定了 Cookie 必定會有嚴(yán)格的大小限制,每一個 Cookie 的大小被限制在了 4kb,值得注意的是 4kb 指的是一個 Name-Value 的大小,而并不是說這個域名可以設(shè)置的 Cookie 總大小只有 4kb

性能缺陷

Cookie 是跟隨著域名的,會隨著每一個同域名請求發(fā)送,但是其實很大一部分請求,比如說圖片等靜態(tài)資源的請求是完全用不著 Cookie 的,雖然每個Cookie只有 4kb 但是積少成多也會帶來巨大的資源浪費(fèi)。

我們可以把靜態(tài)資源放到 CDN 上去,這時候圖片域名就和主站域名不相同了,就不會附帶發(fā)送 Cookie

不夠安全

正如上文直接打開控制臺就可以看到 Cookie 一樣,Cookie 雖然通過編碼進(jìn)行了加密,但在 Http 傳輸中是明文傳輸,腳本也可以很輕松的獲取到 Cookie,非常容易被破解。

在服務(wù)器端設(shè)置 Cookie 的時候附帶上 HttpOnly 標(biāo)記,這樣在瀏覽器端就無法使用 document.cookie 訪問到這個 Cookie 了

Set-Cookie: id=a3fWa; HttpOnly

標(biāo)記為 Secure 的 Cookie 只應(yīng)通過 Https 協(xié)議加密過的請求發(fā)送,但是即便如此也不應(yīng)該使用 Cookie 儲存敏感信息,因為 Cookie 有其固有的不安全性,這兩個標(biāo)記也無法提供確切的安全保障。

解決方法

既然 Cookie 有這么多缺點,有沒有什么一勞永逸的解決方法呢,那就是「專業(yè)的人做專業(yè)的事」。

用戶登錄態(tài)和部分用戶信息的存儲的工作交給 Seesion ---即 Cookie 只用來儲存一個用戶唯一標(biāo)識符,真正信息儲存在服務(wù)器端,使用 Cookie 作為 SeesionID 去服務(wù)器查找信息,這樣一來 Cookie 的容量限制,安全問題都引刃而解了,因為此時 Cookie 里面就是一串無意義的隨機(jī)碼。

本地儲存得工作交由html5 中新增本地存儲的解決方案「Web Storage」,它又分成兩類 :localStorage和SessionStorage,接下來就介紹這兩兄弟。

LocalStorage

特點

  • 數(shù)據(jù)長時間保存,直到手動刪除為止
  • 大小約為 5M
  • 和 Cookie 一樣,一個網(wǎng)站只能訪問和操作自己網(wǎng)站域名下的數(shù)據(jù)
  • 僅在客戶端使用,和服務(wù)端無通信
  • 接口封裝較好
  • 使用鍵值對保存信息
  • 同源窗口都可以訪問

使用示例

LocalStorage 使用非常方便:

// 設(shè)置數(shù)據(jù)
localStorage.setItem("key","value");
//讀取數(shù)據(jù)
let valueLocal = localStorage.getItem("key");

使用場景

通過上面那些特性就可以看出 LocalStorage 非常適合用來做本地緩存,可以提高首屏加載速度。一些圖片等不會經(jīng)常改變的大資源也可以緩存下來,減少網(wǎng)絡(luò)請求。

SeesionStorage

特點

  • 保存時間為本次會話,也就是說窗口關(guān)閉就沒了
  • 僅本窗口可以訪問,同源的其他窗口都不行大
  • 小約為 5M

使用場景

sessionStorage 更適合用來存儲生命周期和它同步的會話級別的信息。這些信息只適用于當(dāng)前會話,比如可以用來做表單數(shù)據(jù)的持久化,防止刷新后表單數(shù)據(jù)丟失

Cookie、LocalStorage 和SessionStorage 之間的區(qū)別

作用域的不同

這三者都遵循協(xié)議,即同協(xié)議,同域名,同端口下才能訪問和修改同一份數(shù)據(jù),唯一不同的就是 SeesionStorage 還要求在同一窗口。

生命周期的不同

  • Cookie可以手動設(shè)置過期時間,默認(rèn)就是本次會話時長,隨著窗口關(guān)閉而刪除,當(dāng)設(shè)置了過期時間時候,就會被儲存到硬盤中直到過期時間才被刪除
  • LocalStorage是持久化的本地儲存,除非你手動刪除,否則會一直存在
  • SessionStorage是會話級別的存儲,也是隨著窗口關(guān)閉而刪除。

總結(jié)

這就是幾種瀏覽器存儲方案,當(dāng)然還有我們應(yīng)該根據(jù)不同方案各自的特點決定什么時候使用什么方案,適合的才是最好的??偨Y(jié)一下本文的幾個重點

  • Cookie 的本職工作并非本地存儲,而是“維持狀態(tài)”
  • Web Storage 是html5 專門為瀏覽器存儲而提供的數(shù)據(jù)存儲機(jī)制,不與服務(wù)端發(fā)生通信

以上就是詳解JS瀏覽器儲存的詳細(xì)內(nèi)容,更多關(guān)于JS瀏覽器儲存的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 深入解析JavaScript中的arguments對象

    深入解析JavaScript中的arguments對象

    arguments是JavaScript里的一個內(nèi)置對象,像數(shù)組結(jié)構(gòu)一樣存儲參數(shù)的傳遞,這里我們就來深入解析JavaScript中的arguments對象,需要的朋友可以參考下
    2016-06-06
  • javascript操作字符串的原生方法

    javascript操作字符串的原生方法

    這篇文章主要介紹了javascript操作字符串的原生方法,并附上了相關(guān)示例,給需要的小伙伴參考下
    2014-12-12
  • document.getElementById的簡寫方式(獲取id對象的簡略寫法)

    document.getElementById的簡寫方式(獲取id對象的簡略寫法)

    在js編寫中,經(jīng)常需要獲取id對象,如果直接用getElementById來獲取,代碼多而且老的瀏覽器不支持這屬性,所有大家可以考慮用下面的代碼。
    2010-09-09
  • JavaScript 內(nèi)置對象屬性及方法集合

    JavaScript 內(nèi)置對象屬性及方法集合

    JavaScript內(nèi)置對象屬性及方法大全,學(xué)習(xí)js的朋友可以收藏下, 方便以后的學(xué)習(xí)。
    2010-07-07
  • 新手入門常用代碼集錦

    新手入門常用代碼集錦

    新手入門常用代碼集錦...
    2007-01-01
  • JavaScript簡介_動力節(jié)點Java學(xué)院整理

    JavaScript簡介_動力節(jié)點Java學(xué)院整理

    JavaScript是一種基于對象(Object)和事件驅(qū)動(EventDriven)并具有安全性能的腳本語言,javascript的出現(xiàn)使得網(wǎng)頁和用戶之間實現(xiàn)了一種實時性的,動態(tài)性的,交互性的關(guān)系,使網(wǎng)頁包含更多活躍的元素和更加精彩的內(nèi)容
    2017-06-06
  • 淺談JS和jQuery的區(qū)別

    淺談JS和jQuery的區(qū)別

    這篇文章主要介紹了JS和jQuery的區(qū)別,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • 深入學(xué)習(xí)JavaScript中的bom

    深入學(xué)習(xí)JavaScript中的bom

    Bom:瀏覽器對象模型提供了獨立于內(nèi)容而與瀏覽器窗口進(jìn)行交互的對象。描述了與瀏覽器進(jìn)行交互的方法和接口,可以對瀏覽器窗口進(jìn)行訪問和操作,下面我們來一起學(xué)習(xí)一下吧
    2019-05-05
  • JavaScript原生對象之Date對象的屬性和方法詳解

    JavaScript原生對象之Date對象的屬性和方法詳解

    這篇文章主要介紹了JavaScript原生對象之Date對象的屬性和方法詳解,需要的朋友可以參考下
    2015-03-03
  • ES6變量賦值和基本數(shù)據(jù)類型詳解

    ES6變量賦值和基本數(shù)據(jù)類型詳解

    本文詳細(xì)講解了ES6變量賦值和基本數(shù)據(jù)類型,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-07-07

最新評論