session在web開發中是一個很是重要的概念,這個概念很抽象,很難定義,也是最讓人迷惑的一個名詞,也是最多被濫用的名字之一,在不一樣的場合,session一次的含義也很不相同。這裏只探討HTTP Session。html
爲了說明問題,這裏基於Java Servlet理解Session的概念與原理,這裏所說Servlet已經涵蓋了JSP技術,由於JSP最終也會被編譯爲Servlet,二者有着相同的本質。java
在Java中,HTTP的Session對象用javax.servlet.http.HttpSession來表示。web
一、概念:Session表明服務器與瀏覽器的一次會話過程,這個過程是連續的,也能夠時斷時續的。在Servlet中,session指的是HttpSession類的對象,這個概念到此結束了,也許會很模糊,但只有看完本文,才能真正有個深入理解。算法
二、Session建立的時間是:瀏覽器
一個常見的誤解是覺得session在有客戶端訪問時就被建立,然而事實是直到某server端程序調用 HttpServletRequest.getSession(true)這樣的語句時才被建立,注意若是JSP沒有顯示的使用 <% @page session="false"%> 關閉session,則JSP文件在編譯成Servlet時將會自動加上這樣一條語句 HttpSession session = HttpServletRequest.getSession(true);這也是JSP中隱含的 session對象的來歷。服務器
因爲session會消耗內存資源,所以,若是不打算使用session,應該在全部的JSP中關閉它。session
引伸:jsp
1)、訪問*.html的靜態資源由於不會被編譯爲Servlet,也就不涉及session的問題。url
2)、當JSP頁面沒有顯式禁止session的時候,在打開瀏覽器第一次請求該jsp的時候,服務器會自動爲其建立一個session,並賦予其一個sessionID,發送給客戶端的瀏覽器。之後客戶端接着請求本應用中其餘資源的時候,會自動在請求頭上添加:spa
Cookie:JSESSIONID=客戶端第一次拿到的session ID
這樣,服務器端在接到請求時候,就會收到session ID,並根據ID在內存中找到以前建立的session對象,提供給請求使用。這也是session使用的基本原理----搞不懂這個,就永遠不明白session的原理。
下面是兩次請求同一個jsp,請求頭信息:
經過圖能夠清晰發現,第二次請求的時候,已經添加session ID的信息。
三、Session刪除的時間是:
1)Session超時:超時指的是連續必定時間服務器沒有收到該Session所對應客戶端的請求,而且這個時間超過了服務器設置的Session超時的最大時間。
2)程序調用HttpSession.invalidate()
3)服務器關閉或服務中止
四、session存放在哪裏:服務器端的內存中。不過session能夠經過特殊的方式作持久化管理。
五、session的id是從哪裏來的,sessionID是如何使用的:當客戶端第一次請求session對象時候,服務器會爲客戶端建立一個session,並將經過特殊算法算出一個session的ID,用來標識該session對象,當瀏覽器下次(session繼續有效時)請求別的資源的時候,瀏覽器會偷偷地將sessionID放置到請求頭中,服務器接收到請求後就獲得該請求的sessionID,服務器找到該id的session返還給請求者(Servlet)使用。一個會話只能有一個session對象,對session來講是隻認id不認人。
六、session會由於瀏覽器的關閉而刪除嗎?
不會,session只會經過上面提到的方式去關閉。
七、同一客戶端機器屢次請求同一個資源,session同樣嗎?
通常來講,每次請求都會新建立一個session。
其實,這個也不必定的,總結下:對於多標籤的瀏覽器(好比360瀏覽器)來講,在一個瀏覽器窗口中,多個標籤同時訪問一個頁面,session是一個。對於多個瀏覽器窗口之間,同時或者相隔很短期訪問一個頁面,session是多個的,和瀏覽器的進程有關。對於一個同一個瀏覽器窗口,直接錄入url訪問同一應用的不一樣資源,session是同樣的。
八、session是一個容器,能夠存放會話過程當中的任何對象。
九、session由於請求(request對象)而產生,同一個會話中多個request共享了一session對象,能夠直接從請求中獲取到session對象。
十、其實,session的建立和使用總在服務端,而瀏覽器歷來都沒獲得過session對象。但瀏覽器能夠請求Servlet(jsp也是Servlet)來獲取session的信息。客戶端瀏覽器真正牢牢拿到的是session ID,而這個對於瀏覽器操做的人來講,是不可見的,而且用戶也無需關心本身處於哪一個會話過程當中。