Session那些事(二)

關於Session和Cookie的關係,這裏詳細分析一些

1.Cookie
Cookie是服務器在本地機器上存儲的小段文本,它是一個簡單的字符串形式的鍵值對。
網絡服務器用HTTP頭向客戶端發送cookie,
(一般情況下Cookie是由服務端生成的,當然js也能操作cookie)
在客戶端,瀏覽器解析這些cookies並將它們保存到本地,
而後當瀏覽器訪問這個服務器時,它會在任何請求上加上這些cookie。
說白了就是每次你和服務器的交互都會帶着這些cookie。

2.Cookie 與Session的關係
我們知道session是在服務端的,http又是無狀態協議,而seesion又是靠session id來區分的,
因此爲了傳遞session id讓服務器識別,這個session id就存放在了cookie中。
(另一種方式是將session id放到url後面,後面我會提到)
因爲每次向服務器發送請求時,http頭都會帶着cookie,
所以服務端就很方便地根據cookie讀取出來的session id來區分各個請求的session。

比如我現在訪問我測試用的servlet,在servlet代碼中寫上

HttpSession session = request.getSession();這樣我就能建立一個session了。

用火狐訪問,查看firebug的網絡信息,我們可以發現他的響應信息中有
Set-Cookie JSESSIONID=5A810D07A1FB78122FFC2A74CA04F255; Path=/Test01/; HttpOnly
這些字樣,這說明訪問服務器的時候,服務端把seesion id寫入到了cookie,
讓客戶端瀏覽器把cookie保存起來。

到這裏我們似乎可以發現些什麼,不知道你看到沒有?
發送請求的時候帶着cookie信息,
從響應信息裏我們又看到了讓瀏覽器設置cookie的信息,

發送請求 響應

從而我們可以得出,在servlet中,想獲得cookie,我們需要從request中取,
下面這段代碼就可以在控制檯中把客戶端過來的cookie信息都打印出來。

Cookie[] cs=request.getCookies();
for(int i=0;i<cs.length;i++){
  System.out.println(cs[i].getName());
  System.out.println(cs[i].getValue());
}而當你想添加cookie時就得往response裏添加。

Cookie c = new Cookie("mycookie","cookie1234");
c.setMaxAge(3000);//設置cookie有效期, 單位爲秒
response.addCookie(c);添加了這個cookie後,你會在剛纔控制檯的cookie打印中看到你這個mycookie信息。

3. 當客戶端禁用了Cookie時,如何識別各個session
其實servlet中可以重寫url,讓他在url後面加上
;jsessionid=52156A910E95E259B6A2C13CC4DAA916
來識別。
我們可以在servlet中寫上response.encodeURL(“test”),這樣的話,
當session建立的時候,而客戶端不支持cookie,則編碼後的url爲
test;jsessionid=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
若session沒有建立,則編碼後的url仍舊爲test
當然如果session建立,客戶端支持cookie的話,那麼編碼後的url也爲test。

4.內存Cookie和普通Cookie的區別:
Session的是以cookie或URL重寫實現的,默認是cookie來實現的。
系統會創造一個名爲JSESSIONID的輸出cookie,這種Cookie叫做session cookie,
這個session cookie有區別persistent cookies,也就是我們通常所說的普通的cookie。


特別值得注意的時:
session cookie是存儲於瀏覽器內存中的,即所謂的內存cookie,並不是寫到硬盤上的,
而普通的cookie則是存在硬盤上的。
我們剛纔看到的JSESSIONID就是一個session cookie,我們通常情是看不到JSESSIONID的,
但是當我們把瀏覽器的cookie禁止後,web服務器會採用URL重寫的方式傳遞session id,
我們就可以在地址欄看到JSESSIONID=XXXXXXXXXXXXXXXXXXXX之類的字符串了。

明白了這個,我們就可以很容易的分辨出persistent cookies和session cookie的區別了。
另外關於兩者安全性也就很清楚了:
session cookie針對某一次會話而言,會話結束session cookie也就隨着消失了;
而persistent cookie只是存在於客戶端硬盤上的一段文本,
可以在服務端建立cookie時來設置任意有效期,
而且可能會遭到cookie欺騙以及針對cookie的跨站腳本攻擊,
自然不如session cookie安全了。

 

發佈了68 篇原創文章 · 獲贊 5 · 訪問量 44萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章