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卻持,需要注意。