Servlet編程專題7之HttpSession

-  Session,即會話,是Web開發中的一種會話狀態跟蹤技術。固然,前面所講述的Cookie也是一種會話跟蹤技術。不一樣的是Cookie是將會話狀態保存在了客戶端,而Session則是將會話狀態保存到了服務器端。java

-  那麼,到底什麼是「會話」?當用戶打開瀏覽器,從發出第一次請求開始,一直到最終關閉瀏覽器,就表示一次會話的完成。web

-  Session並非JavaWeb開發所持有的,而是整個Web開發中所使用的技術。在JavaWeb開發中,Session是以javax.servlet.http.HttpSession的接口對象的形式出現的。算法


一、Session的訪問:編程

a、Session對象的建立:瀏覽器

javax.servlet.http.HttpServletRequest接口中有兩個方法,getSession()方法和getSession(boolean create)方法:緩存

-  getSession()方法:用於返回與請求相關聯的當前session,或者若是請求中沒有session,建立一個並返回。安全

-  getSession()方法:用於返回與請求相關聯的當前session,或者傳入的參數爲true時,若是請求中沒有session,建立一個並返回。(若是傳入的參數爲false時,不建立Session,返回null。)服務器

f6c0eda734774a5ed80a884fce9e89cf.png


二、對Session域屬性空間的操做:session

-  Session是一個專門用於存放數據的集合,咱們通常稱這個用於存放數據的內存空間爲域屬性空間,簡稱爲域。HttpSession中具備三個方法,是專門用於對該域屬性空間中數據進行寫、讀操做的。併發

99595ad91fd72826b97a01f387435723.png

6d0bede8c44488ff6b31e4dbe5e52520.png

9d9ec7eca028d3543c30c6c678aa8866.png


三、Session的工做原理:在服務器中系統會爲每一個會話維護一個Session。不一樣的會話,對應不一樣的Session。那麼,系統是如何識別各個Session對象的?便是如何作到在同一個會話過程當中,一直使用的是同一個Session對象的?

a、寫入Session列表:

-  服務器對當前應用中的Session是以Map的形式進行管理的,這個Map稱之爲Session列表。該Map的key爲一個32位長度的隨機串,這個隨機串稱之爲JSessionID,value則爲Session對象的引用。

-  當用戶第一次提交請求時,服務器Servlet中執行到request.getSession()方法後,會自動生成一個Map.Entry對象,key爲一個根據某種算法新生成的JSessionID,value則爲新建立的HttpSession對象。

8429a1b59371e61ce632312a0039f4ae.png


b、服務器生成併發送Cookie:

-  在將Session信息寫入Session列表以後,系統還會自動將「JSESSIONID」做爲name,這個32位長度的隨機串做爲value,以Cookie的形式存放到響應報頭中,並隨着響應,將該Cookie發送到客戶端中。

043919100a31f3efaa07064c9bcdcba2.png


c、客戶端接收併發送Cookie:

-  客戶端接收這個Cookie後會將其存放到瀏覽器的緩存中。即,只要客戶端瀏覽器不關閉,瀏覽器緩存中的Cookie就不會失效。

-  當用戶提交第二次請求時,會將緩存中的這個Cookie,伴隨着請求的頭部信息,一塊發送給服務器

c9d44326b3c5f48670843431b106f911.png


d、從Session列表中查找:

-  服務器從請求中讀取到客戶端發送來的Cookie,並根據Cookie的JSSESSIONID的值,從Map中查找相應key對應的value,即Session對象。而後,對該Session對象的域屬性進行讀寫操做。


四、Session的失效:

-  Web開發中引入的Session超時的概念,Session的失效就是指Session的超時。若某個Session在指定的時間範圍內一直未被訪問,那麼Session將超時,即將失效。

-  在web.xml中能夠經過<session-config>標籤設置Session的超時時間,單位爲分鐘。默認Session的超時時間爲30分鐘。須要再次強調的是,這個時間並非從Session被建立開始計時的生命週期長,而是從最後一次被訪問開始計時,在指定的時長內一直未被訪問的時長。

b3744841b4a05779579644a0ef4115f5.png

-  若未到超時時限,也能夠經過代碼提早使Session失效。使用

javax.servlet.http.HttpSession接口中的invalidate()方法:

fbf4834a1481b59c99b4f2e034e19a87.png


五、Cookie禁用後使用Session進行會話跟蹤:

-  從前面Session的工做原理可知,服務器之因此能夠針對不一樣的會話找到不一樣的Session,是由於Cookie完成了會話的跟蹤。可是,若客戶端瀏覽器將Cookie禁用,那麼服務器還怎麼保證同一會話使用的是同一個Session呢?

-  若客戶端瀏覽器禁用了Cookie,會發現向服務器所提交的每一次請求,服務器在給出的響應中都會包含名稱爲JSESSIONID的Cookie,只不過這個Cookie的值每一次都不一樣。也就是說,只要客戶端瀏覽器所提交的請求中沒有包含JSESSIONID,服務器就會認爲這是一個新的會話的開始,就會爲其生成一個Map.Entry對象,key爲新的32位長度的隨機串,value爲新建立的Session會話引用。這樣的話,也就沒法實現會話跟蹤。


-  附加說明:

a、域屬性空間範圍對比:

-  在JavaWeb編程的API中,存在四個能夠存放域屬性的空間範圍對象,這四個對象中所存儲的域屬性做用範圍,由大到小分別爲:

-  ServletContext -> HttpSession -> HttpServletRequest -> PageContext

-  ServletContext,即application,置入其中的域屬性是整個應用範圍的,能夠完成跨會話共享數據。

-  HttpSession,置入其中的域屬性是會話範圍的,能夠完成跨請求共享數據。

-  HttpServletRequest,置入其中的域屬性是請求範圍的,能夠完成跨Servlet共享數據,可是這些Servlet必須在同一個請求中。

-  PageContext,置入其中的域屬性是頁面範圍的,不經常使用。

-  對於ServletContext,HttpSession,HttpServletRequest這三個域屬性空間對象的使用原則是,在能夠保證功能需求的前提下,優先使用小範圍的。這樣不只能夠節省服務器內存,還能夠保證數據的安全性。

相關文章
相關標籤/搜索