1. 程式人生 > >理解cookie、session、localStorage、sessionStorage之不同

理解cookie、session、localStorage、sessionStorage之不同

平時經常會把前端瀏覽器的幾種快取方式拿來作比較,
cookie
localStorage
sessionStorage
直接上一張圖,一目瞭然
cookie、localStorage、sessionStorage之不同

這次主要來說說cookie和session的區別

cookie可以在前後端進行使用者的身份認證,標記使用者。說到為什麼要使用cookie,那得說到http。話說,http是一種無狀態的協議,它的無狀態可以用翻臉不認人(瀏覽器)來表示了;以至於伺服器不會記得前一秒是哪個客戶端向它發出了請求,這就會導致一種情況出現:小熊登入了淘寶;跳轉一下頁面,需要再登入;加入購物車,需要再登入;付款需要在登陸……想想真是太糟糕,使用者體驗極差,不能好好玩耍了。
http無狀態


在服務端的解決辦法是:用session去管理cookie。

session

session為何物?
session是由cookie進行標記的。當需要記住使用者時,比如前面說的登入,在服務端會設定一個響應頭Set-Cookie,返回給客戶端,例如:Set-Cookie:SESSIONID=12345678;客戶端接收到這個響應後,此後傳送的每一個請求瀏覽器都會自動帶上Cookie請求頭,對應內容是Cookie:SESSIONID=12345678。在服務端記憶體中存有session,將客戶端傳送的請求中的cookie值與記憶體中的session進行對比,就可以識別這個客戶端了,也就能避免上圖中那種尷尬的情況。
但是這又會引發新的問題。
如果用session在服務端進行儲存,會出現的情況是,在一個處理淘寶業務的伺服器叢集中,不同的伺服器被分配處理的業務不同,他們都處於淘寶這個大域名下,每臺伺服器的記憶體中都保留著一份同樣的session,這就涉及到伺服器之間session的複製。如若有100臺伺服器,每臺伺服器都有著同樣的session,那麼session所佔用的記憶體之多可以想象。伺服器既要處理業務,還得維護session的同步,如此一來,伺服器無法通過增加業務的方式進行擴張,不易進行橫向擴充套件。
解決辦法:將有狀態的服務轉化為無狀態的服務


(1)共享session
將session提取出來,集中存放(有點像開闢了一個session資料庫的趕腳。。)

(2)token
服務是不需要進行儲存,服務可以通過解析token裡面的資訊來判斷是否登陸。token 裡面是可以攜帶cookie解析出來的資訊的。這種情況下,去掉了伺服器儲存的負擔,只需要每次在服務端對token增加一個校驗就可以了。

在學習session這塊的同時,注意到,在高併發情況下,叢集中伺服器的分佈是可以加以設計和優化的。就拿雙十一的淘寶,同時那麼多人訪問,仍舊堅挺著,這是為什麼?當業務量巨大的時候,同一個域名底下可以有一堆伺服器處理大量複雜的業務,防止網站崩潰;這個時候就需要進行負載均衡的設計了
不學不知道,一學嚇一跳。。。快快去看看負載均衡是個啥大人物,後續再總結咯。