Cookie 是存儲在用戶端計算機上的文本檔案,并保留了各種跟蹤資訊。Java Servlet 顯然支援 HTTP Cookie。
識别傳回使用者包括三個步驟:
伺服器腳本向浏覽器發送一組 Cookie。例如:姓名、年齡或識别号碼等。
浏覽器将這些資訊存儲在本地計算機上,以備将來使用。
當下一次浏覽器向 Web 伺服器發送任何請求時,浏覽器會把這些 Cookie 資訊發送到伺服器,伺服器将使用這些資訊來識别使用者。
本章将向您講解如何設定或重置 Cookie,如何通路它們,以及如何将它們删除。
Servlet Cookie 處理需要對中文進行編碼與解碼,方法如下:
Cookie 通常設定在 HTTP 頭資訊中(雖然 JavaScript 也可以直接在浏覽器上設定一個 Cookie)。設定 Cookie 的 Servlet 會發送如下的頭資訊:
正如您所看到的,Set-Cookie 頭包含了一個名稱值對、一個 GMT 日期、一個路徑和一個域。名稱和值會被 URL 編碼。expires 字段是一個指令,告訴浏覽器在給定的時間和日期之後"忘記"該 Cookie。
如果浏覽器被配置為存儲 Cookie,它将會保留此資訊直到到期日期。如果使用者的浏覽器指向任何比對該 Cookie 的路徑和域的頁面,它會重新發送 Cookie 到伺服器。浏覽器的頭資訊可能如下所示:
Servlet 就能夠通過請求方法 request.getCookies() 通路 Cookie,該方法将傳回一個 Cookie 對象的數組。
以下是在 Servlet 中操作 Cookie 時可使用的有用的方法清單。
序号
方法 & 描述
1
<b>public void setDomain(String pattern)</b>
該方法設定 cookie 适用的域,例如 runoob.com。
2
<b>public String getDomain()</b>
該方法擷取 cookie 适用的域,例如 runoob.com。
3
<b>public void setMaxAge(int expiry)</b>
該方法設定 cookie 過期的時間(以秒為機關)。如果不這樣設定,cookie 隻會在目前 session 會話中持續有效。
4
<b>public int getMaxAge()</b>
該方法傳回 cookie 的最大生存周期(以秒為機關),預設情況下,-1 表示 cookie 将持續下去,直到浏覽器關閉。
5
<b>public String getName()</b>
該方法傳回 cookie 的名稱。名稱在建立後不能改變。
6
<b>public void setValue(String newValue)</b>
該方法設定與 cookie 關聯的值。
7
<b>public String getValue()</b>
該方法擷取與 cookie 關聯的值。
8
<b>public void setPath(String uri)</b>
該方法設定 cookie 适用的路徑。如果您不指定路徑,與目前頁面相同目錄下的(包括子目錄下的)所有 URL 都會傳回 cookie。
9
<b>public String getPath()</b>
該方法擷取 cookie 适用的路徑。
10
<b>public void setSecure(boolean flag)</b>
該方法設定布爾值,表示 cookie 是否應該隻在加密的(即 SSL)連接配接上發送。
11
<b>public void setComment(String purpose)</b>
設定cookie的注釋。該注釋在浏覽器向使用者呈現 cookie 時非常有用。
12
<b>public String getComment()</b>
擷取 cookie 的注釋,如果 cookie 沒有注釋則傳回 null。
通過 Servlet 設定 Cookie 包括三個步驟:
<b>(1) 建立一個 Cookie 對象:</b>您可以調用帶有 cookie 名稱和 cookie 值的 Cookie 構造函數,cookie 名稱和 cookie 值都是字元串。
請記住,無論是名字還是值,都不應該包含空格或以下任何字元:
<b>(2) 設定最大生存周期:</b>您可以使用 setMaxAge 方法來指定 cookie 能夠保持有效的時間(以秒為機關)。下面将設定一個最長有效期為 24 小時的 cookie。
<b>(3) 發送 Cookie 到 HTTP 響應頭:</b>您可以使用 <b>response.addCookie</b> 來添加 HTTP 響應頭中的 Cookie,如下所示:
讓我們修改我們的 表單資料執行個體,為名字和姓氏設定 Cookie。
編譯上面的 Servlet <b>HelloForm</b>,并在 web.xml 檔案中建立适當的條目:
最後嘗試下面的 HTML 頁面來調用 Servlet。
儲存上面的 HTML 内容到檔案 /TomcatTest/test.html 中。
接下來我們通路http://localhost:8080/TomcatTest/test.html,Gif 示範如下:
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIml2ZucDdlxmdyV2cvw1Nw8CX0EDMy8CXzRWYvxGc19CX05WZ052bj1Cc39CXt92YuI2bv5Wdy5yd3d3Lc9CX6MHc0RHaiojIsJye.gif)
注意:以上的一些路徑需要根據你項目實際路徑修改。
要讀取 Cookie,您需要通過調用 HttpServletRequest 的 <b>getCookies( )</b> 方法建立一個 javax.servlet.http.Cookie 對象的數組。然後循環周遊數組,并使用 getName() 和 getValue() 方法來通路每個 cookie 和關聯的值。
讓我們讀取上面的執行個體中設定的 Cookie
編譯上面的 Servlet <b>ReadCookies</b>,并在 web.xml 檔案中建立适當的條目。嘗試運作 http://localhost:8080/TomcatTest/ReadCookies,将顯示如下結果:
删除 Cookie 是非常簡單的。如果您想删除一個 cookie,那麼您隻需要按照以下三個步驟進行:
讀取一個現有的 cookie,并把它存儲在 Cookie 對象中。
使用 <b>setMaxAge()</b> 方法設定 cookie 的年齡為零,來删除現有的 cookie。
把這個 cookie 添加到響應頭。
下面的例子将删除現有的名為 "url" 的 cookie,當您下次運作 ReadCookies 的 Servlet 時,它會傳回 url 為 null。
編譯上面的 Servlet <b>DeleteCookies</b>,并在 web.xml 檔案中建立适當的條目。現在運作 http://localhost:8080/TomcatTest/DeleteCookies,将顯示如下結果: