Cookie 和 Session 原理和區別

2021-10-23 22:26:47 字數 4360 閱讀 6968

什麼是會話:當瀏覽器發請求訪問伺服器開始,一直到訪問伺服器結束,瀏覽器關閉為止,這期間瀏覽器和伺服器之間產生的所有請求和響應加在一起,就稱之為瀏覽器和伺服器之間的一次會話。

在一次會話中往往會產生一些資料,而這些資料往往是需要我們儲存起來的,如何儲存會話中產生的這些資料呢?

可以使用cookie或者session儲存會話中產生的資料。

如何將會話中產生的資料儲存到cookie或者是session中?

cookie是將繪畫中產生的資料儲存在客戶端,是客戶端技術。

cookie是基於兩個頭進行工作的:分別是set-cookie響應頭和cookie請求頭

通過set-cookie響應頭將cookie從伺服器端傳送給瀏覽器,讓瀏覽器儲存到內部;而瀏覽器一旦儲存了cookie,以後瀏覽器每次訪問伺服器時,都會通過cookie請求頭,將cookie資訊再帶回伺服器中。在需要時,在伺服器端可以獲取請求中的cookie中的資料,從而實現某些功能。

1、建立cookie物件

cookie c =

newcookie

(string name , string value)

;//建立cookie的同時需要指定cookie的名字和cookie要儲存的值

2、將cookie新增到response響應中

response.

addcookie

(cookie c)

;// 將cookie新增到響應中,由伺服器負責將cookie資訊傳送給瀏覽器,再由瀏覽器儲存到內部(可以多次呼叫該方法,新增乙個以上的cookie)

3、獲取其請求中的所有的cookie物件組成的陣列

cookie [

] cs = request.

getcookies()

;// 獲取請求中攜帶的所有cookie組成的cookie物件陣列,如果請求中沒有攜帶任何cookie,呼叫該方法會返回null。

4、刪除瀏覽器中的cookie

// cookie的api中沒有提供直接刪除cookie的方法,可以通過別的方式間接刪除cookie
//建立乙個名稱為cart和cookie

cookie c =

newcookie

("cart",""

);//設定cookie的最大生存時間為零

c.setmaxage(0

);//將cookie新增到響應中,傳送給瀏覽器

response.

addcookie

(c);

out.

write

("成功刪除了名稱為cart的cookie......"

)

5、cookie的常用方法

cookie.

getname()

;//獲取cookie的名字

cookie.

getvalue()

;//獲取cookie中儲存的值

cookie.

setvalue()

;// 設定/修改cookie中儲存的值(沒有setname方法,因為cookie的名字無法修改)

cookie.

setmaxage()

;//設定cookie的最大生存時間,如果不設定,cookie預設在一次回話結束時間銷毀!

6、setmaxage方法:設定cookie的最大生存時間

如果不設定該方法,cookie預設是會話級別的cookie,即生存時間是一次會話。當瀏覽器關閉,會話結束時,cookie也會被銷毀(cookie預設存在瀏覽器的記憶體中,當瀏覽器關閉,記憶體釋放,cookie也會隨著記憶體的釋放而銷毀。)

如果設定了該方法,cookie將不會儲存到瀏覽器的記憶體中,而是以檔案形式儲存到瀏覽器的臨時資料夾中(也就是硬碟上),這樣再關閉瀏覽器,記憶體釋放,儲存到硬碟上的cookie檔案不會銷毀,再次開啟瀏覽器,還可以獲取硬碟上的cookie資訊。

**示例:

//建立乙個cookie物件,將商品資訊儲存到cookie中

cookie cookie =

newcookie

("cart"

,prod)

;//設定cookie的最大生存時間,單位:秒

cookie.

setmaxage(60

*60*24

);//將cookie物件新增到response響應中

session是將會話中產生的資料儲存在伺服器端,是伺服器端技術

session是乙個域物件,session中也儲存了乙個map集合,往session中存資料,其實就是講資料儲存到session的map集合中。

通過session.setattribute()方法可以將資料儲存到session中,通過session.setattribute()方法可以將資料從session中取出來

獲取session物件:

request.

getsession()

//獲取乙個session域中新增乙個域屬性,屬性名只能是字串型別, 屬性值可以是任意型別

session.

getattribute

(string attrname)

;//根據屬性名獲取域中的屬性值,返回值是乙個object型別

(1)生命週期:建立session:第一次呼叫request.getsession()方法時,會建立乙個session物件。(當瀏覽器在服務端沒有對應的session時,呼叫request.getsession()方法伺服器會建立乙個session物件。)

銷毀session

自殺:呼叫session的invaliddate方法時,會立即銷毀session

意外身亡:當伺服器非正常關閉時(硬體損壞,斷電,記憶體溢位等導致伺服器非正常關閉),session會隨著伺服器的關閉而銷毀;

當伺服器正常關閉,在關閉之前,伺服器會將內部的session 物件序列化儲存到伺服器的word目錄下,變為乙個檔案。這個過程叫做session的鈍化(序列化);再次將伺服器啟動起來,鈍化著的session會彩瓷回到伺服器,變為伺服器的物件,這個過程叫做session的活化(反序列化)。

(2)作用範圍:

在一次回話範圍內(獲取到的都是同乙個session物件)

(3)主要功能:

在整個回話範圍內實現資料的共享

cookie和session都屬於會話技術,都可以儲存會話中產生的資料,但由於cookie 和 session 的工作原理和特點不同,因此兩者的應用場景也不一樣、

cookie的特點:

cookie是會話中產生的資料儲存在瀏覽器客戶端,是客戶端技術(js可以訪問cookie)

cookie是講資料儲存在客戶端瀏覽器,容易隨著使用者的操作導致cookie丟失或者被竊取,因此cookie中儲存的資料不太穩定,也不太安全

但cookie將資料儲存在客戶端,對伺服器端內有太多影響,可以將資料儲存很長時間

總結:因此cookie中適合儲存需要長時間儲存,但對安全性要求不高的資料

瀏覽器對cookie的大小和個數都有限制,一般推薦每乙個站點給瀏覽器傳送的cookie數量不超過20個,每乙個cookie的大小不超過1kb

cookie的應用:實現購物車,記住使用者名稱,30天內自動登入等

session的特點:

session是講會話中產生的資料儲存在伺服器端,是伺服器端技術

session將資料存在伺服器端的session物件中,相對更加的安全,而且更加穩定。不容易隨著使用者的操作而導致session中的資料丟失或者是被竊取

但session是伺服器端的物件,在併發量較高時每乙個瀏覽器客戶端在伺服器端都要對應乙個session物件,占用伺服器的記憶體空間,影響效率

總結:因此session中適合儲存對安全性要求較高,但不需要長時間儲存的資料

session的應用:儲存登入狀態,儲存驗證碼

以下問題是針對tomcat8.0及8.0以下的版本,在tomcat8.5及8.5以後的版本中已經解決了該問題!

cookie和session和token是什麼?

什麼是session?什麼是cookie?什麼是token?1 cookie?由於http是一種無狀態協議,伺服器沒有辦法單單從網路連線上面知道訪問者的身份,為了解決這個問題,就誕生了cookie cookie實際上是一小段的4k文字資訊。客戶端請求伺服器,如果伺服器需要記錄該使用者狀態,就使用re...

Session和Cookie的區別

session和cookie的區別 1 儲存的位置不同 session儲存在伺服器端的記憶體中,占用伺服器資源。cookie是儲存在客戶端。可以是瀏覽器中或者是檔案中 2 儲存的時間不同 session是關閉當前會話相關瀏覽器後自動清空。cookie是根據過期時間而會有不同。3 安全性不同 sess...

cookie和session的區別

一 cookie機制和session機制的區別 具體來說cookie機制採用的是在客戶端保持狀態的方案,而session機制採用的是在伺服器端保持狀態的方案。同時我們也看到,由於在伺服器端保持狀態的方案在客戶端也需要儲存乙個標識,所以session機制可能需要借助於cookie機制來達到儲存標識的目...