瀏覽器的本地存儲
傳統的本地存儲cookie和session
前端和后端進行數據交互的時候,是用http請求的,但是http是一種無狀態的協議(所謂無狀態,是指收到一個請求,返回一個響應,不關心請求者的身份),http也不是一種持久性的連接,對於請求來說,記住某個用戶的身份特征是比較困難的,后來就出現了cookie的機制。
cookie
-
用戶端保存請求信息的機制
cookie的出現,就是為了在用戶端保存用戶的身份。瀏覽器會在操作系統里開辟一個文件,專門存放cookie,這個文件只要不刪除,就會一直存在。而在每次請求后端時,都會在http的頭里面的,帶上這個cookie信息,后端就會知道這個http請求是由誰發來的。
-
分號分隔的多個key-value字段
cookie其實是一個字符串,它的格式就是分號分隔的多個key-value字段。
-
存儲在本地的加密文件里
cookie存儲在系統的本地文件里,這是可以通過瀏覽器操作的,為數不多的文件之一。但是出於安全考慮,這個cookie文件一般的加密的,只能通過瀏覽器可以操作它。如果直接打開這個cookie文件,就會發現它是一堆加密后的文本,不能直接閱讀里面的內容。
-
域名和路徑限制
cookie有域名和路徑的限制,一個請求只能操作自己有權限的cookie。
cookie里的字段
-
name :cookie名稱
-
domain:cookie生效的域名(有作用域限制,二級域名可以使用一級域名的cookie,但是不能其他域名的cookie,也不能操作所屬三級域名的cookie)
-
path:cookie生效的路徑
-
expiress:cookie過期時間
-
HttpOnly:cookie由服務設置的,並且不允許在用戶端進行更改,對於這種類型的cookie,js是操作不到它的,這是為了防止用戶端惡意修改cookie,造成安全問題。
cookie的缺點
盡管 cookie的設計目的是在 http中保存用戶狀態,但在某些情況下,也可以將它作為一個本地存儲。但這種使用方式有一個缺點,就是有些信息我們只需在本地存儲就能使用,例如:記錄用戶選擇了哪個菜單等等,這完全是為前端展示而設計的,但當這些信息記錄到 cookie中時,所有在線請求都會包含這條與后端沒有什么關系的 cooKie,增加了網絡請求的體積,這樣做並不科學。
session
-
服務端保存請求信息的機制
-
sessionId通常存放在cookie里
在接到http請求以后,服務端生成一個sessionId,然后把這個sessionId種到用戶的cookie里,這樣同一個用戶,再次發出請求時,就會根據帶過來的cookie,知道這個請求是由誰發的。當然sessionId也不一定都是用cookie來實現的,也可以是放在請求參數里,或者是在http的頭里面開辟一個token字段。
-
會話由瀏覽器控制,會話結束,session失效
沒有設置時間的cookie,只會存在於一次會話中,瀏覽器一關閉就結束了。而cookie里這個一般不會設置時間的sessionId也就消失了。
H5里面的本地存儲
localStorage
-
H5新特性
-
有域名限制,不存在作用域概念
域名是完全匹配的,不像cookie那樣有繼承性,只能在當前域名下使用。
-
只有key-value
localStorage 被存在一個對象里,也是一些key-value的鍵值對,而且這個value只能是基礎類型。如果使用了對象等引用類型,它會把對象的toString()結果,作為value存起來,里面的信息也就丟失了。
-
沒有過期時間
只要不刪除,它就一直存在
-
瀏覽器關閉后不消失
以文件的形式存儲在操作系統上,但是也是不可讀的。
sessionStorage
- 瀏覽器關閉后消失
