cookie和session有什么區(qū)別?
cookie:存儲于客戶端 安全級別低 存儲量有限 一般不超過4k
session:存在服務(wù)器端 安全性較高 存儲空間大 但是內(nèi)存占用量也大,而且session不能獨(dú)立存在,必須依賴cookie
flask中cookie和session介紹
一、cookie:
在網(wǎng)站中,http請求是無狀態(tài)的。也就是說即使第一次和服務(wù)器連接后并且登錄成功后,第二次請求服務(wù)器依然不能知道當(dāng)前請求是哪個用戶。cookie的出現(xiàn)就是為了解決這個問題,第一次登錄后服務(wù)器返回一些數(shù)據(jù)(cookie)給瀏覽器,然后瀏覽器保存在本地,當(dāng)該用戶發(fā)送第二次請求的時(shí)候,就會自動的把上次請求存儲的cookie數(shù)據(jù)自動的攜帶給服務(wù)器,服務(wù)器通過瀏覽器攜帶的數(shù)據(jù)就能判斷當(dāng)前用戶是哪個了。cookie存儲的數(shù)據(jù)量有限,不同的瀏覽器有不同的存儲大小,但一般不超過4KB。因此使用cookie只能存儲一些小量的數(shù)據(jù)。
二、session:
session和cookie的作用有點(diǎn)類似,都是為了存儲用戶相關(guān)的信息。不同的是,cookie是存儲在本地瀏覽器,而session存儲在服務(wù)器。存儲在服務(wù)器的數(shù)據(jù)會更加的安全,不容易被竊取。但存儲在服務(wù)器也有一定的弊端,就是會占用服務(wù)器的資源,但現(xiàn)在服務(wù)器已經(jīng)發(fā)展至今,一些session信息還是綽綽有余的。
三、cookie和session結(jié)合使用:
web開發(fā)發(fā)展至今,cookie和session的使用已經(jīng)出現(xiàn)了一些非常成熟的方案。在如今的市場或者企業(yè)里,一般有兩種存儲方式:
1、存儲在服務(wù)端:通過cookie存儲一個session_id,然后具體的數(shù)據(jù)則是保存在session中。如果用戶已經(jīng)登錄,則服務(wù)器會在cookie中保存一個session_id,下次再次請求的時(shí)候,會把該session_id攜帶上來,服務(wù)器根據(jù)session_id在session庫中獲取用戶的session數(shù)據(jù)。就能知道該用戶到底是誰,以及之前保存的一些狀態(tài)信息。這種專業(yè)術(shù)語叫做server side session。
2、將session數(shù)據(jù)加密,然后存儲在cookie中。這種專業(yè)術(shù)語叫做client side session。flask采用的就是這種方式,但是也可以替換成其他形式。
localStorage和sessionStorage區(qū)別
localStorage和sessionStorage一樣都是用來存儲客戶端臨時(shí)信息的對象。
他們均只能存儲字符串類型的對象(雖然規(guī)范中可以存儲其他原生類型的對象,但是目前為止沒有瀏覽器對其進(jìn)行實(shí)現(xiàn))。
localStorage生命周期是永久,這意味著除非用戶顯示在瀏覽器提供的UI上清除localStorage信息,否則這些信息將永遠(yuǎn)存在。
sessionStorage生命周期為當(dāng)前窗口或標(biāo)簽頁,一旦窗口或標(biāo)簽頁被永久關(guān)閉了,那么所有通過sessionStorage存儲的數(shù)據(jù)也就被清空了。
不同瀏覽器無法共享localStorage或sessionStorage中的信息。相同瀏覽器的不同頁面間可以共享相同的 localStorage(頁面屬于相同域名和端口),但是不同頁面或標(biāo)簽頁間無法共享sessionStorage的信息。這里需要注意的是,頁面及標(biāo) 簽頁僅指頂級窗口,如果一個標(biāo)簽頁包含多個iframe標(biāo)簽且他們屬于同源頁面,那么他們之間是可以共享sessionStorage的。
同源的判斷規(guī)則:
http://www.test.com
https://www.test.com (不同源,因?yàn)閰f(xié)議不同)
http://my.test.com(不同源,因?yàn)橹鳈C(jī)名不同)
http://www.test.com:8080(不同源,因?yàn)槎丝诓煌?
localStorage和sessionStorage使用時(shí)使用相同的API:
localStorage.setItem("key","value");//以“key”為名稱存儲一個值“value”
localStorage.getItem("key");//獲取名稱為“key”的值
枚舉localStorage的方法:
for(var i=0;i<localStorage.length;i++){
var name = localStorage.key(i)?;
var value = localStorage.getItem(name);?
}
刪除localStorage中存儲信息的方法:
localStorage.removeItem("key");//刪除名稱為“key”的信息。
localStorage.clear();?//清空localStorage中所有信息
通過getItem或直接使用localStorage["key"]獲取到的信息均為實(shí)際存儲的副本。
例如:
localStorage.key = {value1:"value1"}?;
localStorage.key.value1='a'?;
這里是無法?對實(shí)際存儲的值產(chǎn)生作用的,下面的寫法也不可以:
?localStorage.getItem("key").value1="a";ss