Servlet Cookie 處理
Cookie 是儲存在客戶端計算機上的文字檔案,並保留了各種跟蹤資訊。Java Servlet 顯然支援 HTTP Cookie。
識別返回使用者包括三個步驟:
伺服器指令碼向瀏覽器傳送一組 Cookie。例如:姓名、年齡或識別號碼等。
瀏覽器將這些資訊儲存在本地計算機上,以備將來使用。
當下一次瀏覽器向 Web 伺服器傳送任何請求時,瀏覽器會把這些 Cookie 資訊傳送到伺服器,伺服器將使用這些資訊來識別使用者。
本章將向您講解如何設定或重置 Cookie,如何訪問它們,以及如何將它們刪除。
Servlet Cookie 處理需要對中文進行編碼與解碼,方法如下:
String str = java.net.URLEncoder.encode("中文","UTF-8"); //編碼
String str = java.net.URLDecoder.decode("編碼後的字串","UTF-8"); // 解碼
Cookie 剖析
Cookie 通常設定在 HTTP 頭資訊中(雖然 JavaScript 也可以直接在瀏覽器上設定一個 Cookie)。設定 Cookie 的 Servlet 會發送如下的頭資訊:
正如您所看到的,Set-Cookie 頭包含了一個名稱值對、一個 GMT 日期、一個路徑和一個域。名稱和值會被 URL 編碼。expires 欄位是一個指令,告訴瀏覽器在給定的時間和日期之後"忘記"該 Cookie。
如果瀏覽器被配置為儲存 Cookie,它將會保留此資訊直到到期日期。如果使用者的瀏覽器指向任何匹配該 Cookie 的路徑和域的頁面,它會重新發送 Cookie 到伺服器。瀏覽器的頭資訊可能如下所示:
Servlet 就能夠通過請求方法 request.getCookies() 訪問 Cookie,該方法將返回一個 Cookie 物件的陣列。
通過 Servlet 設定 Cookie 包括三個步驟:
(1) 建立一個 Cookie 物件:您可以呼叫帶有 cookie 名稱和 cookie 值的 Cookie 建構函式,cookie 名稱和 cookie 值都是字串。
Cookie cookie = new Cookie("key","value");
(2) 設定最大生存週期:您可以使用 setMaxAge 方法來指定 cookie 能夠保持有效的時間(以秒為單位)。下面將設定一個最長有效期為 24 小時的 cookie。
cookie.setMaxAge(60*60*24);
(3) 傳送 Cookie 到 HTTP 響應頭:您可以使用 response.addCookie 來新增 HTTP 響應頭中的 Cookie,如下所示:
response.addCookie(cookie);
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
// 為名字和姓氏建立 Cookie
Cookie name = new Cookie("name",
URLEncoder.encode(request.getParameter("name"), "UTF-8")); // 中文轉碼
Cookie url = new Cookie("url",
request.getParameter("url"));
// 為兩個 Cookie 設定過期日期為 24 小時後
name.setMaxAge(60*60*24);
url.setMaxAge(60*60*24);
// 在響應頭中新增兩個 Cookie
response.addCookie( name );
response.addCookie( url );
// 設定響應內容型別
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
String title = "設定 Cookie 例項";
String docType = "<!DOCTYPE html>\n";
out.println(docType +
"<html>\n" +
"<head><title>" + title + "</title></head>\n" +
"<body bgcolor=\"#f0f0f0\">\n" +
"<h1 align=\"center\">" + title + "</h1>\n" +
"<ul>\n" +
" <li><b>站點名:</b>:"
+ request.getParameter("name") + "\n</li>" +
" <li><b>站點 URL:</b>:"
+ request.getParameter("url") + "\n</li>" +
"</ul>\n" +
"</body></html>");
}
通過 Servlet 讀取 Cookie
要讀取 Cookie,您需要通過呼叫 HttpServletRequest 的 getCookies( ) 方法建立一個 javax.servlet.http.Cookie 物件的陣列。然後迴圈遍歷陣列,並使用 getName() 和 getValue() 方法來訪問每個 cookie 和關聯的值。
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
Cookie cookie = null;
Cookie[] cookies = null;
// 獲取與該域相關的 Cookie 的陣列
cookies = request.getCookies();
// 設定響應內容型別
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
String title = "Delete Cookie Example";
String docType = "<!DOCTYPE html>\n";
out.println(docType +
"<html>\n" +
"<head><title>" + title + "</title></head>\n" +
"<body bgcolor=\"#f0f0f0\">\n" );
if( cookies != null ){
out.println("<h2>Cookie 名稱和值</h2>");
for (int i = 0; i < cookies.length; i++){
cookie = cookies[i];
if((cookie.getName( )).compareTo("name") == 0 ){
cookie.setMaxAge(0);
response.addCookie(cookie);
out.print("已刪除的 cookie:" +
cookie.getName( ) + "<br/>");
}
out.print("名稱:" + cookie.getName( ) + ",");
out.print("值:" + URLDecoder.decode(cookie.getValue(), "utf-8") +" <br/>");
}
}else{
out.println(
"<h2 class=\"tutheader\">No Cookie founds</h2>");
}
out.println("</body>");
out.println("</html>");
}
刪除 Cookie 是非常簡單的。如果您想刪除一個 cookie,那麼您只需要按照以下三個步驟進行:
1、讀取一個現有的 cookie,並把它儲存在 Cookie 物件中。
2、使用 setMaxAge() 方法設定 cookie 的年齡為零,來刪除現有的 cookie。
3、把這個 cookie 新增到響應頭。