小白對cookie,session基礎瞭解---

Cookie、Session

什麼是會話?

瀏覽器在請求訪問服務器開始,一直到訪問瀏覽器結束,瀏覽器關閉爲止,這期間瀏覽器和服務器之間產生的全部請求和響應加在一塊兒,就稱爲瀏覽器和服務器之間的一次會話。
在一次會話中每每會產生一些數據,而這些數據須要咱們保存起來,例:
*好比在沒有登陸時,將商品記載到購物車,其實就是將商品信息存入到了coocie或者session中。

能夠用cookie或者session保存會話中產生的數據數組

Cookie的工做原理

image
1:Cookie是將會話中產生的數據保存在客戶端,屬於客戶端技術;
2:Cookie是基於兩個頭進行工做的:Set-Cookie響應頭和Cookie請求頭;
3:經過Set-Cookie響應頭將Cookie從服務器發送到瀏覽器,讓瀏覽器保存到內部;而瀏覽器一旦保存了Cookie,之後瀏覽器每次訪問服務器時,都會經過Cookie請求頭,將Cookie信息帶回到服務器中。在須要時,在服務器端能夠獲取請求中Cookie的數據,從而實現一些功能;瀏覽器

Cookie中API的應用

1.建立Cookie對象安全

Cookie cookie = new Cookie(String name,Stringvalue);
// 建立cookie的同時須要指定cookie的名字和cookie要保存的值
// Cookie的名字一旦指定後,就沒法修改!

2.將Cookie添加到response響應中服務器

response.addCookie(Cookie cookie);
// 將cookie添加到響應中,由服務器負責將cookie信息發送給瀏覽器,再由瀏覽器保存到內部(能夠屢次調用該方法,添加一個以上的cookie

3.獲取請求中的全部Cookie對象組成的數組cookie

Cookie[] cookie = request.getCookies();
// 獲取請求中攜帶的全部cookie組成的cookie對象數組,若是請求中沒有攜帶任何cookie,調用該方法會返回null。

4.刪除瀏覽器中的Cookiesession

// cookie的API中沒有提供直接刪除cookie的方法,能夠經過別的方式間接刪除cookie
// 刪除名稱爲cart的cookie:能夠向瀏覽器再發送一個同名的cookie(即名稱也叫作cart),並設置cookie的最大生存時間爲零,因爲瀏覽器是根據cookie的名字來區分cookie,若是先後兩次向瀏覽器發送同名的cookie,後發送的cookie會覆蓋以前發送的cookie。然後發送的cookie設置了生存時間爲零,所以瀏覽器收到後也會當即刪除!

image
5.Cookie的經常使用方法:併發

cookie.getName(); // 獲取cookie的名字
cookie.getValue(); // 獲取cookie中保存的值
cookie.setValue(); // 設置/修改cookie中保存的值(沒有setName方法,由於cookie的名字沒法修改)
cookie.setMaxAge(); //設置cookie的最大生存時間(若是不設置,cookie默認在一次會話結束時銷燬!)

6.設置Cookie最大的生存時間(SetMaxAge):spa

cookie。setMaxAge(60)  //單位爲秒

示例:
image3d


Session原理及應用

Session的工做原理

image
1:Session是將會話中的產生的數據保存在服務器端,屬於服務器端技術;
2:Session是一個域對象,Seesion中也保存了一個map集合,往Session中存數據,其實就是將數據保存到Session指定map集合中;
3:經過session.setAttribute()方法,能夠將數據存入到Session中,經過session.getAttribute()方法能夠將數據從session中取出來;code

Session是一個域對象

獲取session對象:

request.getSession()
//獲取一個Session對象,若是在服務器內部中由當前瀏覽器對應的session,則直接返回該session對象;若是沒有對應的session,則會先建立一個新的session對象再返回;

Session是一個域對象,在session中也保存了一個map集合,而且sess中也提供了存取數據的方法,以下:

session.setAttribute(String attrName,Object attrValue);
//往session域中添加一個域屬性,屬性名必須爲字符串類型,屬性值能夠爲任意類型
session。setAttribute(String attrName);
//根據屬性名能夠獲取域中的屬性值,返回值是一個Object類型

Session域對象的三大特性:

(1)生命週期:

建立session:
第一次調用request.getSession()方法時,會建立一個session對象。(當瀏覽器在服務器端沒有對應的session時,調用request.getSession()方法,服務器會建立一個session對象)
銷燬session:
1.超時銷燬
默認狀況下,當超過30分鐘沒有訪問session時,session就會超時銷燬(30分鐘是默認時間,能夠修改);
2.自殺:
調用session的invalidate方法時,會當即銷燬session;
3.意外身亡:
1)當服務器非正常關閉時(硬件損壞,斷電,內存溢出等致使服務器非正常關閉),session會隨着服務器的關閉而銷燬;
2)當服務器正常關閉,在關閉以前,服務器會將內部的session對象序列化保存到服務器的work目錄下,變爲一個文件。這個過程叫作session的鈍化(序列化);再次將服務器啓動起來,鈍化着的session會再次回到服務器,變爲服務中的對象,這個過程叫作session的活化(反序列化);

(2)做用範圍:

在一次會話範圍內(獲取到的都是同一個session對象)

(3)主要功能:

在整個會話範圍內實現數據的共享


總結 二者的區別

Cookie和Session都屬於會話技術,均可以保存會話中產生的數據,可是因爲Cookie和Session的工做原理和特色不一樣,多以二者的應用場景也不一樣。

Cookie的特色:

1.Cookie是將會話中產生的數據存入到瀏覽器客戶端,屬於客戶端技術(JS能夠訪問cookie)
2.Cookie是將數據保存到瀏覽器客戶端,容易隨着用戶的操做致使cookie丟失或被竊取,所以cookie中保存的數據不太穩定,也不太安全
3.cookie中數據存在瀏覽器中,對服務器端沒有太大影響,能夠將數據保存很長時間
4.瀏覽器對cookie的大小和個數都有限制,通常每一個站點給瀏覽器發送的cookie不超過20個,每一個cookie大小不超過1KB

總結:cookie中適合存須要長時間保存的,對安全性要求不高的數據;

Session的特色:

1.Session是將會話產生的內容存入到服務器端,屬於服務器端技術
2.session將數據存入到服務器端的session對象中,相對來講更加安全,穩定。不容易隨着用戶的操做而致使session中數據丟失
3.session是服務器端的對象,在併發量較高的時候,每個瀏覽器客戶端在服務端都要對應一個session對象,佔用服務器的內存空間,影響效率

總結:session中適合存儲對安全性要求較高,但不須要長時間保存的數據;

注意:cookie中保存中文數據的問題,Tomcat8.5及8.5之後的版本中已經解決了該問題!

注意:獲取不到以前的session的問題

將商品保存到session中後,關閉瀏覽器再打開瀏覽器,訪問服務器,此時獲取不到以前的session。由於session是基於Cookie工做的。

在服務器建立一個session後,會爲session分配一個獨一無二的編號,稱之爲session的id,在這次響應時,服務器會將session的id以一個名稱爲JSESSIONID的cookie發送給瀏覽器保存到瀏覽器內部。

因爲保存sessionid的cookie默認是會話級別的cookie,在瀏覽器關閉後,cookie會跟着銷燬,sessionid也丟失了。所以下次訪問服務器,沒有session的id就獲取不到以前的session。也獲取不到session中的商品信息

解決方法:咱們能夠建立一個名稱爲JSESSIONID的cookie,其中保存session的ID,並設置cookie的最大存活時間,讓cookie保存到硬盤上(即便瀏覽器關閉,cookie也不會銷燬),這樣下次訪問服務器時,還能夠將sessionid帶給服務器,服務器能夠經過sessionid獲取到以前的session。 從session中獲取到商品信息
image

相關文章
相關標籤/搜索