1. 程式人生 > >基於Servlet的會話跟蹤(一)

基於Servlet的會話跟蹤(一)

1、HTTP協議的無狀態

當客戶端向伺服器傳送一個請求後,伺服器為每一個客戶,建立一個唯一的識別符號-ID號,並在響應的時候,把這個ID號傳送給客戶端瀏覽器。當瀏覽器再次發生請求的時候,同時也把這個ID號傳送給伺服器,那麼伺服器可以通過客戶的ID來區分是哪個客戶了。

2、會話跟蹤

2.1、什麼是會話

Java Servlet API中引入session機制來跟蹤客戶的狀態。session指的是在一段時間內,單個客戶與Web伺服器的一連串相關的互動過程(當前瀏覽器與伺服器之間多次的請求、響應關係,被稱為一個會話)。在一個session中,客戶可能會多次請求訪問同一個網頁,也有可能請求訪問各種不同的伺服器資源。

2.2、如何進行會話跟蹤

Servlet API中定義了javax.servlet.http.HttpSession介面,Servlet容器必須實現這個介面。當一個session開始時,Servlet容器建立一個HttpSession物件,並同時在記憶體中為其開闢一個空間,在HttpSession物件中可以存放客戶狀態的資訊(例如:購物車)。Servlet容器為HttpSession分配一個唯一識別符號,稱為SessionIDServlet容器把SessionID儲存在客戶的瀏覽器中。每次客戶發出HTTP請求時,Servlet容器可以從HttpRequest物件中讀取SessionID,然後根據

SessionID找到相應的HttpSession物件,從而獲取客戶的狀態資訊。

2.3、會話的建立和使用

會話的建立

Servlet中的HttpRequestServlet物件為我們提供了兩種建立和獲取HttpSession物件的方法。

1HttpSession session = request.getSession(Boolean value);

2HttpSession session = request.getSession();

在第1種方法中,布林值為true時,如果存在與當前請求關聯的會話,就返回該會話。否則建立一個新會話,並把該會話返回。布林值為false時,如果存在與當前請求關聯的會話,就返回會話,否則返回

null,不再建立會話。

2種方法等同於第1種方法中的布林引數值為true時的情況。

會話的使用

javax.servlet.http.HttpSession介面中定義的方法,最常用的是有關進行資料存取的方法。

session.setAttribute(String name,Object value);

session.getAttribute(String name);

setAttribute(String name,Object value)是把一個物件value儲存在HttpSession物件中,併為其指定引用名稱為name,當我們想使用已經儲存在sesion中的資料時,我們可以使用sesion.getAttribute(String name)方法,把資料取出來。其中name為我們在存入資料時,指定的引用名稱。

注意:session.getAttribute(String name)方法的返回值是Object型別,所以在取出資料時,我們要對其進行資料型別轉換,而且必須與我們存入的資料型別一致。

例如:String value = (String)session.getAttribute(“xinxin”);

2.4HttpSession物件的存在週期

2.4.1HttpSession物件的建立

當客戶端瀏覽器第一次訪問伺服器時,伺服器為每個瀏覽器建立不同的HttpSession物件。在伺服器端使用request.getSession()方法來獲得HttpSession物件,並以此來使用HttpSession介面為我們提供的方法。

2.4.2HttpSession物件的使用

在建立HttpSession物件後,使用該物件進行資料的存取,以進行資料的傳遞。在此過程中我們常用的方法如下。

void setAttribute(String name,Object value):進行資料的儲存。

Object getAttribute(String name):進行資料的讀取。

2.4.3HttpSession物件的結束

在以下情況下,session會結束

1)、關閉瀏覽器,關閉session

2)、呼叫HttpSessioninvalidate()方法,刪除HttpSession物件和資料。

3)、兩次訪問時間間隔大於session定義的非活動時間間隔。

例如:隔多長時間自動銷燬session物件:

session.setMaxInactiveInterval();

session結束時,伺服器會清空當前瀏覽器相關的資料資訊。

3、HttpSession技術不屬於HTTP協議範圍內,它是因為HTTP協議不能滿足對使用者的跟蹤而產生的一種技術,它是由Web容器為程式提供的服務。

session是由伺服器也就是Web容器建立的,我們使用request.getSession()來獲取HttpSession物件。使用session.setAttribute()進行資料的儲存,而使用session.getAttribute()來獲得session內已儲存的值。

4、Serializable(序列化)介面,序列化的好處。

Java語言為我們提供了一種序列化機制,可以把一個實現了Serializable介面的物件轉換成一組byte資料,在用到這個物件的時候,能把這些byte資料恢復出來,重新構建哪個物件。

程式在執行時,會產生物件,這些物件會隨著程式的停止而消失,但是我們想把這些物件儲存下來,讓這些物件在程式執行終止後,仍然存在,可以讓程式再次執行時讀取這些值,或者在其他程式中利用這些儲存下來的物件,在這種情況下,我們可以使用序列化來完成。

5、在使用session進行資料儲存的時候,要考慮該資料是否合適被存入session中,如果是當前使用者經常使用的資料,則可以存入session中,如果使用者只用了一次,不再使用或者是偶爾才會使用的資料,則不要存入session中,因為這樣會增加系統資源的浪費。

6、Web專案中使用session,是為了跟蹤使用者狀態,並區分不同的使用者。

7、會話是Web容器建立的,而不是由程式設計師編碼建立的。當客戶端瀏覽器第一次訪問伺服器時候,伺服器為客戶建立一個session