SSM基礎篇(二)--Cookie&Session

會話

  • 當瀏覽器發請求訪問服務器開始,一直到訪問服務器結束,瀏覽器關閉爲止,這期間瀏覽器和服務器之間產生的全部請求和響應加在一塊兒,就稱之爲瀏覽器和服務器之間的一次會話。
  • 在一次會話中每每會產生一些數據,而這些數據每每是須要咱們保存起來的,可使用cookie或者session保存會話中產生的數據。
  • 由於http協議是無狀態的,每次的請求訪問都是獨立的,沒辦法追蹤到上一次訪問的狀態,後端就沒法知道此次的訪問是哪位,因此就要一些技術來幫助後臺辨別此次的請求是誰。而這二者Cookie與Session都是Web程序中經常使用的技術,用來跟蹤用戶的整個會話。

Cookie

  1. Cookie是將會話中產生的數據保存在客戶端,是客戶端技術。
  2. Cookie是基於兩個頭進行工做的:分別是Set-Cookie響應頭和Cookie請求頭
  3. 經過Set-Cookie響應頭將cookie從服務器端發送給瀏覽器,讓瀏覽器保存到

內部;而瀏覽器一旦保存了cookie,之後瀏覽器每次訪問服務器時,都會通
過cookie請求頭,將cookie信息再帶回服務器中。在須要時,在服務器端能夠獲取請求中的cookie中的數據,從而實現某些功能。
imageweb

cookie的API及應用

一、建立Cookie對象後端

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

二、將Cookie添加到response響應中跨域

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

三、獲取請求中的全部cookie對象組成的數組數組

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

四、刪除瀏覽器中的Cookie瀏覽器

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

代碼示例:安全

//建立一個名稱爲cart的cookie
Cookie c = new Cookie("cart", "");
//設置cookie的最大生存時間爲零
c.setMaxAge( 0 );
//將cookie添加到響應中,發送給瀏覽器
response.addCookie( c );
out.write( "成功刪除了名稱爲cart的cookie..." );

五、Cookie的經常使用方法服務器

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

六、setMaxAge方法:設置cookie的最大生存時間cookie

  • 若是不設置該方法,cookie默認是會話級別的cookie,即生存時間是一次會話。當瀏覽器關閉,會話結束時,cookie也會被銷燬(cookie默認存在瀏覽器的內存中,當瀏覽器關閉,內存釋放,cookie也會隨着內存的釋放而銷燬。)
  • 若是設置了該方法,cookie將不會保存到瀏覽器的內存中,而是以文件形式保存到瀏覽器的臨時文件夾中(也就是硬盤上),這樣再關閉瀏覽器,內存釋放,保存到硬盤上的cookie文件不會銷燬,再次打開瀏覽器,還能夠獲取硬盤上的cookie信息。

代碼示例:網絡

//建立一個Cookie對象,將商品信息保存到cookie中
Cookie cookie = new Cookie( "cart", prod );
//設置cookie的最大生存時間, 單位:秒
cookie.setMaxAge( 60*60*24 );
//將cookie對象添加到response響應中
response.addCookie( cookie );

Cookie的不可跨域名性

不少網站都會使用Cookie。例如,Google會向客戶端頒發Cookie,Baidu也會向客戶端頒發Cookie。那瀏覽器訪問Google會不會也攜帶上Baidu頒發的Cookie呢?或者Google能不能修改Baidu頒發的Cookie呢?
答案是否認的。Cookie具備不可跨域名性。根據Cookie規範,瀏覽器訪問Google只會攜帶Google的Cookie,而不會攜帶Baidu的Cookie。Google也只能操做Google的Cookie,而不能操做Baidu的Cookie。session

Cookie的有效期

Cookie的maxAge決定着Cookie的有效期,單位爲秒(Second)。Cookie中經過getMaxAge()方法與setMaxAge(int maxAge)方法來讀寫maxAge屬性。
若是maxAge屬性爲正數,則表示該Cookie會在maxAge秒以後自動失效。瀏覽器會將maxAge爲正數的Cookie持久化,即寫到對應的Cookie文件中。不管客戶關閉了瀏覽器仍是電腦,只要還在maxAge秒以前,登陸網站時該Cookie仍然有效。下面代碼中的Cookie信息將永遠有效。

Cookie的安全屬性

HTTP協議不只是無狀態的,並且是不安全的。使用HTTP協議的數據不通過任何加密就直接在網絡上傳播,有被截獲的可能。使用HTTP協議傳輸很機密的內容是一種隱患。若是不但願Cookie在HTTP等非安全協議中傳輸,能夠設置Cookie的secure屬性爲true。瀏覽器只會在HTTPS和SSL等安全協議中傳輸此類Cookie。

Session

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

image

session是一個域對象

獲取session對象:

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

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

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

Session域對象的三大特徵:

生命週期:

建立session:

第一次調用request.getSession()方法時,會建立一個session對象。(當瀏覽器在服務器端沒有對應的session時,調用request.getSession()方法服務器會建立一個session象。)

銷燬session:
  • 超時銷燬:默認狀況下,當超過30分鐘沒有訪問session,session就會超時銷燬。(30分鐘是默認時間,能夠修改,但不推薦修改)
  • 自殺:調用session的invalidate方法時,會當即銷session。
  • 意外身亡:當服務器非正常關閉時(硬件損壞,斷電,內存溢出等致使服務器非正常關閉),session會隨着服務器的關閉而銷燬;

當服務器正常關閉,在關閉以前,服務器會將內部的session對象序列化保存到服務器的work目錄下,變爲一個文件。這個過程叫作session的鈍化(序列化);再次將服務器啓動起來,鈍化着的session會再次回到服務器,變爲服務器中的對象,這個過程叫作session的活化(反序列化)。

做用範圍:

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

主要功能:

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

二者的區別

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

Cookie的特色:

  1. cookie是將會話中產生的數據保存在瀏覽器客戶端, 是客戶端技術(JS能夠訪問cookie)
  2. cookie是將數據保存在客戶端瀏覽器,容易隨着用戶的操做致使cookie丟失或者被竊取,所以cookie中保存的數據不太穩定,也不太安全。
  3. 但cookie將數據保存在客戶端,對服務器端沒有太多影響,能夠將數據保存很長時間。
  4. 總結:所以cookie中適合存儲須要長時間保存、但對安全性要求不高的數據。
  5. 瀏覽器對cookie的大小和個數都有限制,通常推薦每個站點給瀏覽器發送的cookie數量不超過20個,每個cookie的大小不超過1kb。
  6. Cookie的應用:實現購物車、記住用戶名、30天內自動登陸等。

Session的特色:

  1. session是將會話中產生的數據保存在服務器端,是服務器端技術
  2. session將數據存在服務器端的session對象中,相對更加的安全,並且更加穩定。不容易隨着用戶的操做而致使session中的數據丟失或者是被竊取。
  3. 但session是服務器端的對象,在併發量較高時每個瀏覽器客戶端在服務器端都要對應一個session對象,佔用服務器的內存空間,影響效率。
  4. 總結:所以session中適合存儲對安全性要求較高,但不須要長時間保存的數據。
  5. Session的應用:保存登陸狀態、保存驗證碼

Session的有效期

因爲會有愈來愈多的用戶訪問服務器,所以Session也會愈來愈多。爲防止內存溢出,服務器會把長時間內沒有活躍的Session從內存刪除。這個時間就是Session的超時時間。若是超過了超時時間沒訪問過服務器,Session就自動失效了。

Session的超時時間爲maxInactiveInterval屬性,能夠經過對應的getMaxInactiveInterval()獲取,經過setMaxInactiveInterval(longinterval)修改。

Session的超時時間也能夠在web.xml中修改。另外,經過調用Session的invalidate()方法可使Session失效。

相關文章
相關標籤/搜索