session在web開發中是一個非常重要的概念,這個概念很抽象,很難定義,也是最讓人迷惑的一個名詞,也是最多被濫用的名字之一,在不同的場合,session一次的含義也很不相同。這里只探討HTTP Session。
1、概念:Session代表服務器與瀏覽器的一次會話過程,這個過程是連續的,也可以時斷時續的。在Servlet中,session指的是HttpSession類的對象,我個人理解的是,Session是服務端,對客戶端發起的某次訪問會話過程的標識。
2、Session創建的時間是:
一個常見的誤解是以為session在有客戶端訪問時就被創建,然而事實是直到某server端程序調用 HttpServletRequest.getSession(true)這樣的語句時才被創建。
由于session會消耗內存資源,因此,如果不打算使用session,應該在所有的服務中關閉它。
引申:
1)訪問*.html的靜態資源因為不會訪問相應的服務,也就不涉及session的問題。
2)在客戶端打開瀏覽器或者直接調用接口第一次請求該服務的時候,服務器會自動為其創建一個session,并賦予其一個sessionID,發送給客戶端。以后客戶端接著請求本應用中其他資源的時候,會自動在請求頭上添加:
Cookie:JSESSIONID=客戶端第一次拿到的session ID
這樣,服務器端在接到請求時候,就會收到session ID,并根據ID在內存中找到之前創建的session對象,提供給請求使用。這也是session使用的基本原理----搞不懂這個,就永遠不明白session的原理。
3、Session刪除的時間是:
1)Session超時:超時指的是連續一定時間服務器沒有收到該Session所對應客戶端的請求,并且這個時間超過了服務器設置的Session超時的最大時間。
2)程序調用HttpSession.invalidate()
3)服務器關閉或服務停止
4、session存放在哪里:服務器端的內存中。不過session可以通過特殊的方式做持久化管理。
5、session的id是從哪里來的,sessionID是如何使用的:
當客戶端第一次請求session對象時候,服務器會為客戶端創建一個session,并將通過特殊算法算出一個session的ID,用來標識該session對象,當客戶端下次(session繼續有效時)請求別的資源的時候,客戶端應將sessionID放置到請求頭中,服務器接收到請求后就得到該請求的sessionID,服務器找到該id的session返還給請求者(Servlet)使用。一個會話只能有一個session對象,對session來說是只認id不認人。
6、session會因為客戶端的關閉而刪除嗎?
不會,session只會通過上面提到的方式去關閉。
7、同一客戶端機器多次請求同一個資源,session一樣嗎?
一般來說,每次請求都會新創建一個session。
即,客戶端新發起的請求,如果不加上服務端提供的session,那么此時服務端會繼續重新創建新的session給客戶端。
8、session是一個容器,可以存放會話過程中的任何對象。
9、session因為請求(request對象)而產生,同一個會話中多個request共享了一session對象,可以直接從請求中獲取到session對象。
10、其實,session的創建和使用總在服務端,而客戶端從來都沒得到過session對象。但瀏覽器可以請求Servlet(jsp也是Servlet)來獲取session的信息。客戶端真正緊緊拿到的是session ID,而這個對于客戶端操作的人來說,是不可見的,并且用戶也無需關心自己處于哪個會話過程中。