Web程式運行時,servlet和Web容器之間需要溝通,servlet和servlet之間也需要溝通。HttpServletRequest和ServletRequest介面提供了兩種方法:一種是設定屬性,也即通過ServletRequest.SetAttribute(),ServletRequest.GetAttribute(),以及removeAttribute()等方法進行設定。這樣當SetvletRequest對象在各個servlet間傳遞的時候,這些屬性就可以被這些servlet共用;另一種方法是:“會話”。
一、會話的概念
簡單的說,會話就是Web容器將一個客戶和這個客戶的一系列請求聯絡起來的一種機制。因為HTTP協議本身是不保持狀態的,因此需要附加一種這樣的機制以達到現實的需求。這個機制是怎麼樣的呢?舉例來說:Web容器就好像是電影院,瀏覽器客戶就好像是看電影的人,它們之間通過電影票來達到一種關聯(同樣這個電影票也是有時間期限的)。與看電影一樣,當Web客戶需要向伺服器請求資源時,他必須出示“電影票”。這個“電影票”典型的代表就是Cookie。Web容器通過三種途徑實現會話:1.Cookie機制 2.URL重寫 3.隱藏表單輸入。其中Cookie是Web伺服器發送給Web客戶的一串資料,瀏覽器在向Web伺服器發送請求時,需要附帶上這個Cookie,以使伺服器可以驗名身份。URL重寫是將會話代碼附加在URL中的方式。隱藏表單輸入是通過HTML表單的hidden無素來實現。需要注意的是以上三個實現會話的方法預設情況下都沒有安全機制,Cookie,URL,隱藏表單的資料都是可以很容易查到的。因此,如果會話編碼需要保密,Web程式應使用加密或SSL串連等安全機制以保證資料安全。
二、處理Cookie
Servlet API的javax.servlet.http.Cookie類用來建立和處理cookie,可以使用HttpServletResponse的addCookie(Cookie)來向瀏覽器發送cookie。一個cookie可以有這些屬性:名稱,值,注釋,路徑,網域名稱,最大年齡,版本號碼等。其中,除了名稱和值外,其它屬生是可選的。在使用addCookie方法向瀏覽器發送cookie時,其時就是在HTTP響應的頭資訊中增加一行以下格式的資料:
Set-Cookie:Name=Value; Version={version};Comment={comment};Domain={domain};Max-Age={age};Path={path}
在瀏覽器向伺服器再次返回請求時,它會將先前此伺服器發送給他的Cookie附帶返回給伺服器,這時Web伺服器就可以通過HttpServletRequest.getCookie()方法取得cookie,此方法返回的是Cookie對象。
整個Cookie處理的過程代碼就好像這樣:
1.伺服器響應,產生Cookie
Cookie ck = new Cookie('ckname','ckvalue');
HttpServletResponse.setCookie(ck);
2.伺服器接收到瀏覽器的請求
Cookie[] cks = HttpServletRequest.getCookie();
cks[0].getvalue();
......
具體的Cookie類屬性和方法參考Servlet JavaDoc。
三、使用HttpSession
HttpSession是利用cookie原理實現的更上一層的會話,一個HttpSession對象就表示一個會話。它的典型應用情境如下:
public void doGet(HttpServletResquest req,HttpServletResponse resp) throws ServletException,IOException
{
HttpSession hs = req.getSession(true);//取得當前請求所屬的會話,若當前沒有會話且參數為true則產生一個新的會話。
hs.getAttribute("atbtName");//取得會話hs的一個屬性atbtName的值。
hs.setAttribute("atbtName",atbtValueObject); //增加或設定一個會話屬性,其值為一個對象引用。
}
詳細的關於HttpSession介面的說明參考Javadoc。
有一點需要說明的是,另然Cookie和HttpSession都可以實現會話,但兩者是有區別的,區別在於HttpSession處於更抽象的一層,使用起來更簡便。更重要的一點是,HttpSession的屬性儲存區的是對象的引用,而且儲存在Web伺服器端,因此,具有更大的使用彈性。而cookie是儲存於瀏覽端,且不同的瀏覽器對Cookie都有不同的限制,如個數限制等。因此,使用HttpSession來管理會話更為直觀和方便。