From Gossip@caterpillar

JSP/Servlet: Cookie

 

 


HTTP協議(Protocol)本身是一種無狀態協議,瀏覽器用HTTP向伺服器請求一個檔案,伺服器就將要求的檔案傳回,然後連線中斷,當瀏覽器發出 另一個請求時,它與上一個請求並無關聯,伺服器不會知道任何有關上一次請求的任何資訊,這對於靜態網頁來說是很自然的處理方式且並不會有問題,然而對於 Web應用程式來說就是一個難題,如果頁面之間沒有關係,則上一個頁面所挑選的商品,在下一個頁面中並不會被得知。

即然HTTP本身是無狀態協議,為了要在下一次請求中,讓伺服器能處理上一次請求中的一些資訊,最自然的方法,就是將上一次請求結果中的一些資訊,在下一次請求時一併傳送給伺服器,基於這種方式,傳統上通常會有三種作法:隱藏表單欄位資訊、URL rewriting或是使用Cookie

隱藏表單欄位基本方式很簡單,就是將下次所需要的訊息發回給客戶端,在客戶端設置一個表單並包括隱藏欄位,這樣客戶端下次發送訊息時,會一併發送隱藏欄位 中的資料,如此就可以維護狀態方面的訊息,這個方法的缺點是狀態訊息不斷的在客戶端與伺服端之間來回,較耗費網路頻寬,並且客戶端可以藉由檢視網頁原始碼 來發現訊息,保密性上有相當的顧慮。

URL rewriting的例子在 session(2) 中有提到一些,您可以直接參考該篇主題的內容。

Cookie是儲存客戶端訊息的一種方式,它儲存在客戶端電腦上,您可以設定給它一個存活期限,保留一些有用的訊息在客戶端,即使是在客戶端關閉瀏覽器之 後,再次連接伺服器時若Cookie仍在有效期限中,就可以再利用Cookie中儲存的訊息,一個常見的應用就是設定表單的自動登入訊息。

cookie是JSP中用來操作Cookie的隱含物件,來看一個實際的例子:

  • cookieDemo.jsp
<%@page contentType="text/html;charset=Big5"%>
<html>
<header><title>Cookie</title></header>
<body>

<%
Cookie[] cookies = request.getCookies();
if(cookies == null) {
Cookie userCookie =
new Cookie("user", "caterpillar");
response.addCookie(userCookie);
out.println("<br>已設定cookie,三秒後重新連接!");
response.setHeader("Refresh",
"3; URL=http://localhost:8080/myjsp/cookie.jsp");
}
else {
for(int i = 0; i < cookies.length; i++) {
out.println("<br>Cookie name: " +
cookies[i].getName());
out.println("<br>Cookie value: " +
cookies[i].getValue());
}
}
%>

</body>
</html>

這個JSP網頁會試著使用 request 隱含物件的getCookies()方法取得所有可用的Cookie物件,如果沒有取得,表示客戶端目前沒有可用的Cookie,此時您新增 Cookie物件,並指定name-value給它,並使用 response 隱含物件的addCookie()方法,將新建立的Cookie物件加入,之後Cookie物件的訊息會以Cookie的方式發回至客戶端並儲存。

如果客戶端有可用的Cookie,則使用迴圈一一將其取出,藉此得到客戶端中可用的狀態或相關訊息,您可以使用getName()方法取得Cookie的 名稱,getValue()取得其中的值,如果是上面的JSP網頁,則getName()會取得 "user" ,而getValue()會取得 "caterpillar"。

Cookie物件有其生命期限,基本上始於建立Cookie時,而關閉瀏覽器之後,自動清除Cookie物件,您也可以設定Cookie的生命期限,讓它 儲存在客戶端久一些,這樣即使關閉瀏覽器,Cookie也不會被清除,您可以使用Cookie的setMaxAge()來設定生命期限,設定單位是秒,例 如:
Cookie userCookie =
            new Cookie("user", "caterpillar");
userCookie.setMaxAge(3600);
response.addCookie(userCookie);
 
如果想要直接刪除使用中的Cookie,則可以設定setMaxAge()方法的參數為 0,即生命期限為 0,就相當於立即讓 Cookie失效。