標籤:
深入理解HTTP Session session在web開發中是一個非常重要的概念,這個概念很抽象,很難定義,也是最讓人迷惑的一個名詞,也是最多被濫用的名字之一,在不同的場合,session一次的含義也很不相同。這裡只探討HTTP Session。 為了說明問題,這裡基於Java Servlet理解Session的概念與原理,這裡所說Servlet已經涵蓋了JSP技術,因為JSP最終也會被編譯為Servlet,兩者有著相同的本質。 在Java中,HTTP的Session對象用javax.servlet.http.HttpSession來表示。 1、概念:Session代表格服務器與瀏覽器的一次會話過程,這個過程是連續的,也可以時斷時續的。在Servlet中,session指的是HttpSession類的對象,這個概念到此結束了,也許會很模糊,但只有看完本文,才能真正有個深刻理解。 2、Session建立的時間是:一個常見的誤解是以為session在有用戶端訪問時就被建立,然而事實是直到某server端程式調用 HttpServletRequest.getSession(true)這樣的語句時才被建立,注意如果JSP沒有顯示的使用 <% @page session="false"%> 關閉session,則JSP檔案在編譯成Servlet時將會自動加上這樣一條語句 HttpSession session = HttpServletRequest.getSession(true);這也是JSP中隱含的 session對象的來曆。由於session會消耗記憶體資源,因此,如果不打算使用session,應該在所有的JSP中關閉它。 引申:1)、訪問*.html的靜態資源因為不會被編譯為Servlet,也就不涉及session的問題。2)、當JSP頁面沒有顯式禁止session的時候,在開啟瀏覽器第一次請求該jsp的時候,伺服器會自動為其建立一個session,並賦予其一個sessionID,發送給用戶端的瀏覽器。以後用戶端接著請求本應用中其他資源的時候,會自動在要求標頭上添加:Cookie:JSESSIONID=用戶端第一次拿到的session ID這樣,伺服器端在接到請求時候,就會收到session ID,並根據ID在記憶體中找到之前建立的session對象,提供給請求使用。這也是session使用的基本原理----搞不懂這個,就永遠不明白session的原理。下面是兩次請求同一個jsp,要求標頭資訊:通過圖可以清晰發現,第二次請求的時候,已經添加session ID的資訊。
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。 其實,這個也不一定的,總結下:對於多標籤的瀏覽器(比如360瀏覽器)來說,在一個瀏覽器視窗中,多個標籤同時訪問一個頁面,session是一個。對於多個瀏覽器視窗之間,同時或者相隔很短時間訪問一個頁面,session是多個的,和瀏覽器的進程有關。對於一個同一個瀏覽器視窗,直接錄入url訪問同一應用的不同資源,session是一樣的。 8、session是一個容器,可以存放會話過程中的任何對象。 9、session因為請求(request對象)而產生,同一個會話中多個request共用了一session對象,可以直接從請求中擷取到session對象。 10、其實,session的建立和使用總在服務端,而瀏覽器從來都沒得到過session對象。但瀏覽器可以請求Servlet(jsp也是Servlet)來擷取session的資訊。用戶端瀏覽器真正緊緊拿到的是session ID,而這個對於瀏覽器操作的人來說,是不可見的,並且使用者也無需關心自己處於哪個會話過程中。
本文出自 “熔 岩” 部落格,請務必保留此出處http://lavasoft.blog.51cto.com/62575/275589
[轉載]深入理解HTTP Session