Cookie是存儲在客戶端計算機上的文本文件,並保留了它們的各種信息跟蹤的目的。 Java Servlet透明支持HTTP Cookie。
涉及標識返回用戶有三個步驟:
服務器腳本發送到瀏覽器的一組cookie。對於如: 姓名,年齡,或識彆號碼等。
瀏覽器將這些信息存儲在本地計算機上,以備將來使用。
下一次瀏覽器發送任何請求,Web服務器,然後這些cookie發送信息到服務器,服務器將使用這些信息來識彆用戶。
本章將教你如何設置或重置cookie,如何訪問它們,以及如何將它們刪除。
Cookies通常設置在HTTP頭(雖然JavaScript也可以直接在瀏覽器上設置一個cookie)。servlet也可以設置一個cookie發送標頭,看起來像這樣:
HTTP/1.1 200 OK Date: Fri, 04 Feb 2000 21:03:38 GMT Server: Apache/1.3.9 (UNIX) PHP/4.0b3 Set-Cookie: name=xyz; expires=Friday, 04-Feb-07 22:03:38 GMT; path=/; domain=tutorialspoint.com Connection: close Content-Type: text/html
正如你可以看到,Set-Cookie頭包含一個名稱值對,時間日期,路徑和域。將URL名稱和值編碼。 expires字段是一個指令到瀏覽器的cookie“忘記”,在給定的時間和日期後。
如果瀏覽器被配置為存儲cookie,它將會保留此信息,直到到期日期。如果用戶的瀏覽器指向任何頁麵相匹配的路徑和域的cookie,它會重新發送到服務器的Cookie。瀏覽器的標題可能會是這個樣子:
GET / HTTP/1.0 Connection: Keep-Alive User-Agent: Mozilla/4.6 (X11; I; Linux 2.2.6-15apmac ppc) Host: zink.demon.co.uk:1126 Accept: image/gif, */* Accept-Encoding: gzip Accept-Language: en Accept-Charset: iso-8859-1,*,utf-8 Cookie: name=xyz
一個servlet就能夠訪問的cookie通過請求方法request.getCookies()返回一個Cookie對象數組。
以下是有用的方法列表時,可以使用servlet操縱cookies。
S.N. | Method & Description |
---|---|
1 |
public void setDomain(String pattern) 這個方法設置域的cookie適用,例如www.gitbook.net |
2 |
public String getDomain() 此方法獲取域的cookie應用,例如gitbook.net |
3 |
public void setMaxAge(int expiry) 此方法設置cookie過期之前多少時間(以秒為單位)間隔。如果不這樣設置,cookie將持續隻對當前會話。 |
4 |
public int getMaxAge() 此方法返回的最大年齡(周期)cookie,以秒為單位指定,默認情況下,-1表示cookie將繼續下去,直到瀏覽器關閉。 |
5 |
public String getName() 此方法返回的cookie的名稱。創建後的名稱不能改變。 |
6 |
public void setValue(String newValue) 此方法設置的cookie值。 |
7 |
public String getValue() 這種方法得到的cookie關聯的值。 |
8 |
public void setPath(String uri) 這個方法設定這個cookie的路徑。如果你不指定路徑,Cookie是相同的目錄以及當前頁麵的所有子目錄中的所有URL返回。 |
9 |
public String getPath() 這種方法得到這個cookie的路徑。 |
10 |
public void setSecure(boolean flag) 這個方法設置布爾值,表示cookie是否應該隻發送的加密(如SSL)連接。 |
11 |
public void setComment(String purpose) 本方法規定了注釋,說明一個cookie的目的。注釋是非常有用的,如果在瀏覽器的cookie展現給用戶。 |
12 |
public String getComment() 此方法返回的注釋,描述這個cookie用途或者為null,如果cookie冇有注釋。 |
設置Cookie的servlet包括三個步驟:
(1) 創建一個Cookie對象:cookie的名稱和cookie的值,這兩個都是字符串調用Cookie的構造函數。
Cookie cookie = new Cookie("key","value");
請記住,無論是名字,也不值應該包含空格或以下任何字符:
[ ] ( ) = , " / ? @ : ;
(2) 設置將最長生存期:可以使用setMaxAge方法到指定多長時間(以秒為單位),在這時間內cookie應該是有效的。以下將成立一個24小時的cookie。
cookie.setMaxAge(60*60*24);
(3) HTTP響應頭的Cookie發送到:使用response.addCookie添加cookie的HTTP響應頭如下:
response.addCookie(cookie);
讓我們修改我們的表格示例,設置第一個和最後一個名字的Cookie
// Import required java libraries import java.io.*; import javax.servlet.*; import javax.servlet.http.*; // Extend HttpServlet class public class HelloForm extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // Create cookies for first and last names. Cookie firstName = new Cookie("first_name", request.getParameter("first_name")); Cookie lastName = new Cookie("last_name", request.getParameter("last_name")); // Set expiry date after 24 Hrs for both the cookies. firstName.setMaxAge(60*60*24); lastName.setMaxAge(60*60*24); // Add both the cookies in the response header. response.addCookie( firstName ); response.addCookie( lastName ); // Set response content type response.setContentType("text/html"); PrintWriter out = response.getWriter(); String title = "Setting Cookies Example"; String docType = "<!doctype html public \"-//w3c//dtd html 4.0 " + "transitional//en\">\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>First Name</b>: " + request.getParameter("first_name") + "\n" + " <li><b>Last Name</b>: " + request.getParameter("last_name") + "\n" + "</ul>\n" + "</body></html>"); } }
編譯以上servlet 的 HelloForm和在web.xml文件中創建相應的條目,最後嘗試下麵的HTML頁麵調用servlet。
<html> <body> <form action="HelloForm" method="GET"> First Name: <input type="text" name="first_name"> <br /> Last Name: <input type="text" name="last_name" /> <input type="submit" value="Submit" /> </form> </body> </html>
保存上述文件為hello.htm,並把它放在<Tomcat-installation-directory>/webapps/ROOT/目錄中HTML內容。
嘗試輸入First Name和Last Name,然後單擊“提交”按鈕。這將顯示在屏幕上,同時設置兩個cookie將被傳遞回服務器,您需要按“提交”按鈕時,下一次的firstName和lastName姓氏和名字。
下一節會解釋,如何在Web應用程序中訪問這些Cookie的備份。
要讀取Cookie,您需要創建一個一係列的javax.servlet.http.Cookie對象調用HttpServletRequest的getCookies()方法。然後循環數組,和使用的getName()和getValue()方法來訪問每個cookie和關聯的值。
讓我們讀取cookie,我們已經在前麵的例子中:
// Import required java libraries import java.io.*; import javax.servlet.*; import javax.servlet.http.*; // Extend HttpServlet class public class ReadCookies extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { Cookie cookie = null; Cookie[] cookies = null; // Get an array of Cookies associated with this domain cookies = request.getCookies(); // Set response content type response.setContentType("text/html"); PrintWriter out = response.getWriter(); String title = "Reading Cookies Example"; String docType = "<!doctype html public \"-//w3c//dtd html 4.0 " + "transitional//en\">\n"; out.println(docType + "<html>\n" + "<head><title>" + title + "</title></head>\n" + "<body bgcolor=\"#f0f0f0\">\n" ); if( cookies != null ){ out.println("<h2> Found Cookies Name and Value</h2>"); for (int i = 0; i < cookies.length; i++){ cookie = cookies[i]; out.print("Name : " + cookie.getName( ) + ", "); out.print("Value: " + cookie.getValue( )+" <br/>"); } }else{ out.println( "<h2>No cookies founds</h2>"); } out.println("</body>"); out.println("</html>"); } }
編譯以上servlet的ReadCookies,並在web.xml文件中創建相應的條目。如果你想有first_name為“John”和last_name的“Player”的cookie的cookie,然後運行http://localhost:8080/ReadCookies將顯示以下結果:
Found Cookies Name and ValueName : first_name, Value: JohnName : last_name, Value: Player |
刪除cookie是非常簡單的。如果你想刪除一個cookie,那麼你隻需要遵循以下三個步驟:
閱讀一個已經存在的cookie,並將其存儲在Cookie對象。
設置cookie的年齡為零,通過setMaxAge()方法來刪除現有的cookie。
將這個Cookie添加到響應頭。
下麵的例子將刪除現有的cookie名為“first_name”,當你將運行ReadCookies的servlet,下一次它會返回空值first_name。
// Import required java libraries import java.io.*; import javax.servlet.*; import javax.servlet.http.*; // Extend HttpServlet class public class DeleteCookies extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { Cookie cookie = null; Cookie[] cookies = null; // Get an array of Cookies associated with this domain cookies = request.getCookies(); // Set response content type -by www.gitbook.net response.setContentType("text/html"); PrintWriter out = response.getWriter(); String title = "Delete Cookies Example"; String docType = "<!doctype html public \"-//w3c//dtd html 4.0 " + "transitional//en\">\n"; out.println(docType + "<html>\n" + "<head><title>" + title + "</title></head>\n" + "<body bgcolor=\"#f0f0f0\">\n" ); if( cookies != null ){ out.println("<h2> Cookies Name and Value</h2>"); for (int i = 0; i < cookies.length; i++){ cookie = cookies[i]; if((cookie.getName( )).compareTo("first_name") == 0 ){ cookie.setMaxAge(0); response.addCookie(cookie); out.print("Deleted cookie : " + cookie.getName( ) + "<br/>"); } out.print("Name : " + cookie.getName( ) + ", "); out.print("Value: " + cookie.getValue( )+" <br/>"); } }else{ out.println( "<h2>No cookies founds</h2>"); } out.println("</body>"); out.println("</html>"); } }
編譯以上DeleteCookies 配置servlet ,並在web.xml文件中創建相應的條目。
現在運行http://localhost:8080/DeleteCookies將顯示如下的結果:
Cookies Name and ValueDeleted cookie : first_nameName : first_name, Value: John Name : last_name, Value: Player |
現在嘗試運行http://localhost:8080/ReadCookies ,它會顯示一個cookie如下:
Found Cookies Name and ValueName : last_name, Value: Player |
您可以手動在Internet Explorer中刪除Cookie。在“工具”菜單,選擇“Internet選項”。要刪除所有Cookie,按“刪除Cookies”。