HTTP無狀態的特性與Session、Cookie的存在
HTTP有一個特性:無狀態的,就是前后兩個HTTP事務它們並不知道對方的信息。
而為了維護會話信息或用戶信息,一般可用Cookie或Session技術緩存信息。
- Cookie是存儲在客戶端的
- Session是存儲在服務端的

如何生成session id?如何根據session id獲取session?如何生成session?
客戶端請求服務器時,如果請求的服務涉及Session的訪問,比如調用request.getSession()或request.getSession(true)(其實此兩句代碼功能相同),如果請求中包含session id,則從ConcurrentHashMap<String, Session>中獲取session,如果不包含session id,則會生成一個新的不沖突的session id。

比較詳細的流程,可見org.apache.catalina.connector.Request.doGetSession(boolean create):

而具體的創建Session的流程,可見org.apache.catalina.session.ManagerBase.createSession(String sessionId):

session id如何進行傳輸
而session id是如何進行傳輸的呢?一般是通過Cookie隨Request和Response在客戶端和服務端間通訊。在Cookie禁用情況下,也可由URL參數的形式進行通訊。有哪幾種方式,有個泛型作了列舉javax.servlet.SessionTrackingMode。
Session通過session id進行識別用戶,那么session id被外人獲取從而偽裝身份,此為Session卻持,需要注意。
