天天看點

對Session、Cookie的完全了解

摘要:導讀: 這是J道論壇中關于Session、Cookie讨論中一個道友的了解,我覺得很好,就把它給轉過來了。 以下是文章内容: 1. HTTP協定本身是連接配接-請求-應答-關閉連接配接模式的,是一種無狀态協定(H

導讀:這是J道論壇中關于Session、Cookie讨論中一個道友的了解,我覺得很好,就把它給轉過來了。

以下是文章内容:

1. HTTP協定本身是“連接配接-請求-應答-關閉連接配接”模式的,是一種無狀态協定(HTTP隻是一個傳輸協定);

2. Cookie規範是為了給HTTP增加狀态跟蹤用的(如果要精确把握,建議仔細閱讀一下相關的RFC),但不是唯一的手段;

3. 所謂Session,指的是用戶端和服務端之間的一段互動過程的狀态資訊(資料);這個狀态如何界定,生命期有多長,這是應用本身的事情;

4. 由于B/S計算模型中計算是在伺服器端完成的,用戶端隻有簡單的顯示邏輯,是以,Session資料對用戶端應該是透明的不可了解的并且應該受控于服務端;Session資料要麼儲存到服務端(HttpSession),要麼在用戶端和服務端之間傳遞(Cookie或url rewritting或Hidden input);

5. 由于HTTP本身的無狀态性,服務端無法知道用戶端相繼發來的請求是來自一個客戶的,是以,當使用服務端HttpSession存儲會話資料的時候用戶端的每個請求都應該包含一個session的辨別(sid, jsessionid 等等)來告訴服務端;

6. 會話資料儲存在服務端(如HttpSession)的好處是減少了HTTP請求的長度,提高了網絡傳輸效率;用戶端session資訊存儲則相反;

7. 用戶端Session存儲隻有一個辦法:cookie(url rewritting和hidden input因為無法做到持久化,不算,隻能作為交換session id的方式,即a method of session tracking),而服務端做法大緻也是一個道理:容器有個session管理器(如tomcat的 org.apache.catalina.session包裡面的類),提供session的生命周期和持久化管理并提供通路session資料的 api;

8. 使用服務端還是用戶端session存儲要看應用的實際情況的。一般來說不要求使用者注冊登入的公共服務系統(如google)采用 cookie做用戶端session存儲(如google的使用者偏好設定),而有使用者管理的系統則使用服務端存儲。原因很顯然:無需使用者登入的系統唯一能夠辨別使用者的就是使用者的電腦,換一台機器就不知道誰是誰了,服務端session存儲根本不管用;而有使用者管理的系統則可以通過使用者id來管理使用者個人資料,進而提供任意複雜的個性化服務;

9. 用戶端和服務端的session存儲在性能、安全性、跨站能力、程式設計友善性等方面都有一定的差別,而且優劣并非絕對(譬如TheServerSide号稱不使用HttpSession,是以性能好,這很顯然:一個具有上億的通路使用者的系統,要在服務端資料庫中檢索出使用者的偏好資訊顯然是低效的,Session管理器不管用什麼資料結構和算法都要耗費大量記憶體和CPU時間;而用cookie,則根本不用檢索和維護session資料,伺服器可以做成無狀态的,當然高效);

繼續閱讀