網址重寫和隐藏域都隻适用于保持那些不需要跨越許多頁面的資訊。如果這些資訊需要跨越很多頁面,這兩種技術就變得很難實作,因為你必須管理每一個頁面的資訊。值得慶幸的是,cookie能夠解決網址重寫和隐藏域都無法解決的問題。
cookie是自動地在Web伺服器和浏覽器之間來回傳遞的一小塊資訊。cookie适用于那些需要跨越許多頁面的資訊。由于cookie是作為HTTP标頭嵌入的,是以傳輸它的過程由HTTP協定處理。除此之外,還可以根據自己的需要設定cookie的有效期限。對于Web浏覽器而言,每台Web伺服器最多可以支援20個cookie。
cookie的不足之處在于,使用者可以通過修改他/她的浏覽器設定來拒絕接受cookie。
要使用cookie,必須熟悉javax.servlet.http.Cookie類,以及HttpServletRequest和HttpServletResponse接口中的幾個方法。
要建立cookie,傳遞一個名稱和一個值給Cookie類的構造器:

例如,要建立一個選擇語言的cookie,可以這麼寫:
建立Cookie之後,可以設定它的domain、path及maxAge屬性。尤其值得關注的是maxAge屬性,因為它決定cookie的有效期限。
為了将一個cookie發送到浏覽器,需在HttpServletResponse上調用add方法:
當浏覽器再次發出對同一個資源或者對同一台伺服器中的不同資源的請求時,它會同時把從Web浏覽器處收到的cookie再傳回去。
cookie也可以利用JavaScript在用戶端進行建立和删除,但是這超出了本書的内容範圍。
要通路浏覽器發出的cookie,可以在HttpServletRequest中使用getCookies方法。該方法将傳回一個Cookie數組,如果請求中沒有cookie,将傳回null。為了找到某個名稱的cookie,需要疊代數組。下面舉個例子,看看如何讀取一個名為maxRecords的cookie。
令人遺憾的是,沒有getCookieByName方法可以使擷取cookie變得更簡單一些。更令人難過的是,也沒有方法可以直接删除cookie。為了删除cookie,需要建立一個同名的cookie,将它的maxAge屬性設定為0,并在HttpServletResponse中添加一個新的cookie。看看下面是如何删除一個名為userName 的cookie的:
為了舉例說明如何在Session管理中使用cookie,可參見代碼清單2-4中的Preference-Servlet類。這個Servlet允許使用者修改4個cookie的值,進而在同一個應用程式中設定其他Servlet的顯示設定。
PreferenceServlet的doGet方法發送了一個表單,其中包含幾個輸入域,如圖2-6所示。
表單的上方有三個連結(Cookie Class、Cookie Info及Preference),可以導航到同一個應用程式的其他Servlet。稍後會簡單介紹一下Cookie Class和Cookie Info。
當使用者送出表單時,會調用PreferenceServlet的doPost方法。doPost方法會建立這些cookie:maxRecords、titleFontSize、titleFontStyle及titleFontWeight,并将同一個cookie的所有之前值都覆寫掉。之後,它會将使用者選擇的值發送給浏覽器。
可以利用下面這個URL來調用PreferenceServlet:
代碼清單2-5中的CookieClassServlet類和代碼清單2-6中的CookieInfoServlet類,是利用PreferenceServlet設定的cookie來格式化它們的内容的。CookieClassServlet Servlet将Cookie類的屬性寫在一個HTML清單中。清單中的項編号由maxRecords cookie的值決定,而這個值則可以由使用者利用PreferenceServlet進行設定。
CookieInfoServlet類讀取titleFontSize、titleFontWeight和titleFontStyle cookie的值,将以下CSS樣式寫到浏覽器中,這裡的x、y和z是指上述cookie的值。
一個div元素用這個樣式來格式化文本“Session Management with Cookies:”。
可以利用下面這個URL調用CookieClassServlet:
可以通過将浏覽器跳轉到下面這個URL,來調用CookieInfoServlet servlet:
圖2-7和圖2-8分别展示了CookieClassServlet和CookieInfoServlet的結果。