Cookie 與 Session 基礎知識

leon830216發表於2014-03-16
1. cookie
儲存使用者個人資訊 (使用者名稱, 密碼, sessionID 等), 個性化資訊 (網站主頁首選項等非重要資訊)
一般大小限制在 4K 位元組

1-1. cookie 的實現方式

1-1-1. 會話性質的 cookie
伺服器向客戶端傳送的 cookie, 如果沒有指定過期時間, cookie 將存放在瀏覽器程式記憶體中, 不會寫入硬碟檔案

1-1-2. 持久化的 cookie
伺服器向客戶端傳送的 cookie, 如果指定了過期時間, 將會在客戶端 (瀏覽器) 的臨時資料夾下生成一個檔案

1-2. cookie 的原理及流程

1-2-1. 伺服器到客戶端
當伺服器端程式碼中寫入 cookie (1-3-2) 時, 返回給客戶端的 http 響應頭中會加入 cookie 資訊, 瀏覽器按照 http 響應頭中的 cookie 資訊在客戶端建立 cookie

1-2-2. 客戶端到伺服器
每次請求, 客戶端的 cookie 資訊被放在 http 請求頭中 (1-3-1) 傳送到伺服器端, 並且同一個域, 在客戶端建立的所有 cookie (只要不過期), 在客戶端的每一次 http 請求都會攜帶, 所以 cookie 在客戶端的大小是有限制的

1-3. 與 cookie 相關的 http 頭
1-3-1. cookie: 客戶端將伺服器設定的 cookie 返回到伺服器
1-3-2. set-cookie: 伺服器向客戶端設定 cookie
1-3-3. cookie2 (RFC2965): 客戶端指示伺服器支援 cookie 的版本
1-3-4. set-cookie2 (RFC2965): 伺服器向客戶端設定 cookie


2. session
儲存使用者登入資訊 (使用者名稱, 許可權資訊等) 和少量的與使用者相關的資料 (查詢用的主鍵等)
對每個使用者的登入都會建立 session, 儘量避免儲存大資料, 以免過多的消耗伺服器記憶體

2-1. session 的原理及流程
伺服器端機制, 伺服器使用類似於雜湊表的結構來儲存所有的 session 資訊
當有客戶端請求時, 伺服器首先檢查請求裡是否已包含 sessionID, 如果已包含則檢索出相關 session 資訊並使用, 如果不包含, 則建立一個 session 並且生成一個與此 session 相關聯的 sessionID, 並在本次響應中返回給客戶端

2-2. session 的實現方式

2-2-1. 利用會話 cookie 的 session
session 是 web 伺服器利用會話 cookie 來實現的, cookie 裡只存放了 SessionID
伺服器上建立一張表, 對應客戶端的 SessionID, 這張表是存放在伺服器上的記憶體中, 當客戶端請求伺服器時, 如果伺服器發現這是一個新的請求, 就會分配一個新的 SessionID, 在瀏覽器記憶體中寫入一個 sessionID 的 cookie

2-2-2. 利用 URL 回寫的 session
伺服器在傳送給瀏覽器頁面的所有連結中都攜帶 sessionID 的引數, 這樣客戶端點選任何一個連結都會把sessionID 帶會伺服器. 如果直接在瀏覽器輸入服務端資源的 url 來請求該資源, 那麼 session 是匹配不到的.
tomcat 對 session 的實現, 是一開始同時使用 cookie 和 URL 回寫機制, 如果發現客戶端支援 cookie, 就繼續使用 cookie, 停止使用 URL 回寫, 如果發現 cookie 被禁用, 就一直使用URL回寫, jsp開發處理到session 的時候, 對頁面中的連結注意應該使用 response.encodeURL()

2-3. session 的結束

2-3-1. 利用 URL 回寫的 session
伺服器端可以清除一個 session 會話, 而客戶端沒有能力清除 session
關閉瀏覽器時並不能夠結束當前的會話 (忽略瀏覽器關閉事件)
關閉瀏覽器後, 下次再訪問同一頁面時, 伺服器會產生新的 session 物件和 sessionID, 但原來的 session 物件還繼續保留在伺服器
在利用 2-2-2 的方法時, 關閉瀏覽器次開啟後手動替換原來的 url 中的 sessionID, 可以恢復之前的會話
當伺服器主動釋放 session 資源, 或 session 物件過期 (一段時間沒有被使用), 則原來的 session 會被清除

2-3-2. 利用會話 cookie 的 session
利用 2-2-1 時, cookie 被存放在瀏覽器記憶體中, 所以一個瀏覽器的程式就會產生一個 session, 可以透過工作管理員檢視程式
對於 ajax 請求, 確切的說是 xmlhttp 元件傳送的 http 請求, 雖然是使用 js 的程式碼自己建立的, 但是依然是藉助於瀏覽器傳送的, 所以可以獲得 session, 所以在 webservice 中使用 session 我們還得自己造一個東西實現 cookie 的功能


3. cookie 與 session 的不同點
3-1. cookie 儲存在客戶端, 減輕了伺服器負擔; session 儲存在伺服器端, 使用者越多, 記憶體消耗越大
3-2. cookie 最早在 RFC2109 中實現, 後續 RFC2965 做了增強. session 並沒有在 http 協議中定義
3-3. cookie 安全性差; session 安全性高
3-4. 過期時間, cookie 可以選擇永久儲存, session 一般設定較短時間

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/22558114/viewspace-1122588/,如需轉載,請註明出處,否則將追究法律責任。

相關文章