1. 程式人生 > >Servlet--淺析會話管理之Cookie、URL重寫、HttpSession原理

Servlet--淺析會話管理之Cookie、URL重寫、HttpSession原理

平常我們在瀏覽網頁的時候,會有一些網站要求我們進行登入,當我們成功登入之後,會發現我們所瀏覽的所有相關網頁都不再需要我們重新登入,這是為什麼呢。還有當我們在電商平臺進行購物的時候,我們雖然是在同一家電商平臺進行購物,但是我們明明是在不同的頁面進行的新增購物車的選項,為什麼最後我們可以在購物車中找到我們所新增的所有商品呢。其實,這些都是我們在Web後臺方面使用了Cookie技術。

Cookie簡介

Cookie定義:Cookie,有時也用其複數形式Cookies,指某些網站為了辨別使用者身份、進行session跟蹤而儲存在使用者本地終端上的資料(通常經過加密)。

session:會話,指一個終端使用者與互動系統進行通訊的時間間隔,通常指從註冊進入系統到登出退出系統之間所經過的時間。具體到Web中的Session指的就是使用者在瀏覽某個網站時,從進入網站到關閉瀏覽器所經過的這段時間,也就是使用者瀏覽這個網站所花費的時間。(摘自百度百科)

實現思想

如何讓網站記住我們,乃至記住我們之前做過的事情,我們可以聯想,如果讓伺服器在我們進行此次請求的時候,可以讓其返回我們進行下次請求時伺服器應該知道的東西給瀏覽器,之後當我們進行下一次請求的時候,就可以讓瀏覽器將剛才所得的資料返回給伺服器,那麼伺服器就有辦法知道我們多次請求之間相關連的資料,也就從邏輯上打破了HTTP請求與響應的每次狀態都是獨立不相關的這個規則。我們就可以實現一個會話,當我們進行了登入之後,到關閉瀏覽器為止,我們的身份都是可以被伺服器所“記住”的。

實現原理

在我們使用瀏覽器對伺服器進行請求的時候,伺服器會先給瀏覽器響應一個set-cookie標頭,瀏覽器收到這個標頭與數值之後,會將它以檔案的形式儲存在計算機上,這檔案就稱之為Cookie。

我們可以設定給Cookie一個存活期限,保留一些有用的資訊在客戶端,當我們關閉瀏覽器並再次開啟瀏覽器連結伺服器之後,這些Cookie仍在有效期限中,瀏覽器會使用cookie標頭自動將Cookie傳送給伺服器,伺服器就可以得知一些先前瀏覽器請求的相關資訊。

URL重寫

所謂URL重寫,就是GET請求引數的應用,當伺服器響應上一次請求時,將某些相關資訊以超連結的方式響應給瀏覽器,超連結中包含請求引數資訊。

HttpSession會話管理原理

嘗試執行HttpServletRequest的getSession時,Web容器會建立HttpSession物件,關鍵在於每個HttpSession物件都會有個特殊的ID,稱為Session ID,你可以執行HttpSession的getID來取得Session ID。這個Session ID預設會使用Cookie儲存在瀏覽器中,在Tomcat中,Cookie的名稱是JSESSIONID,數值則是getID所取得的Session ID。

Web容器本身是執行在JVM中的一個Java程式,通過getSession取得HttpSession,是Web容器中的一個Java物件,HttpSession中存放的屬性,自然也就存放在伺服器端的Web容器中。每個HttpSession都有一個自己的Session ID,當瀏覽器請求應用程式時,會將Cookie中存放的Session ID一併傳送給應用程式,Web容器根據Session ID找到相對應的HttpSession 物件,這樣就可以取得各個瀏覽器的個別會話的資料。

Web容器儲存Session ID的Cookie“預設”關閉瀏覽器就失效,所以重啟瀏覽器請求應用程式時,通過getSession得到的是新的HttpSession物件。

實際上,預設關閉瀏覽器失效的不是HttpSession,而是瀏覽器上的Cookie,因為Cookie失效了,所以就不能通過Cookie來發送Session ID,所以嘗試getSession時,容器會產生新的HttpSession。要讓HttpSession立即失效,需要使用invalidate方法,否則,HttpSession會等到設定的失效期間過後才會被容器銷燬回收。

HttpSession與URL重寫

當我們瀏覽器禁用Cookie的時候,也就是無法使用Cookie傳送Session ID該怎麼辦,在HttpSession中,也可以搭配URL重寫進行HttpSession的會話管理。我們可以使用想瀏覽器響應一段超連結,超連結後面附加Session ID,當用戶點選超連結的時候,Session ID以GET請求傳送給Web應用程式。

如果要使用URL重寫的方式來發送Session ID,可以使用HttpServletResponse的encodeURL協助產生所需的URL重寫,若容器能從請求中得到帶有Session ID的Cookie,encodeURL就對URL沒有什麼作用,若容器不能從Cookie中得到Session ID則encodeURL會自動產生帶有Session ID的URL重寫。