------------------------------------Cookie概述及示例-------------------------------------------
- Cookie概述
- 什麼叫Cookie
Cookie翻譯成中文是小甜點,小餅乾的意思。在HTTP中它表示服務器送給客戶端瀏覽器的小甜點。其實Cookie就是一個鍵和一個值構成的,隨着服務器端的響應發送給客戶端瀏覽器。然後客戶端瀏覽器會把Cookie保存起來,當下一次再訪問服務器時把Cookie再發送給服務器。
- 2 Cookie規範
你大可以放心,Cookie不會佔滿你的硬盤。因爲一個Cookie最多隻有4KB,並且瀏覽器最多可以保存300個Cookie。當然,在瀏覽器大戰的今天,一些瀏覽器爲了打敗對手,可能對Cookie規範“擴展”了一些,例如每個Cookie的大小爲8KB,最多可保存500個Cookie等!但也不會出現把你硬盤佔滿的可能!
不同的瀏覽器之間不能共享Cookie!!!
- 3 Cookie的作用
Cookie的作用可大了,但無論怎麼誇大Cookie的作用都離不開“跟蹤客戶端狀態”這句話。我們知道Cookie是服務器保存在客戶端的信息,然後客戶端會在下次請求時把Cookie在還給服務器,這樣服務器就可以通過信息來識別客戶端了。
代碼示例:
public class RegistServlet extends HttpServlet {
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("UTF-8"); //獲取用戶名和密碼 String username = request.getParameter("username"); String password = request.getParameter("password");
System.out.println("用戶名:"+username); System.out.println("密碼:"+password); //將用戶和密碼賦給regist屬性 request.setAttribute("username",username); request.setAttribute("passward",password); //如果跳轉到regist1.html頁面,這時當前servlet的request作用就消失了 //如果跳轉到的是servlet,那麼當前servlet的request域作用繼續存在 request.getRequestDispatcher("/regist1.html").forward(request, response); } } |
public class Regist1Servlet extends HttpServlet {
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //獲得性別 String gender = request.getParameter("gender"); //獲得職位 String job = request.getParameter("job"); //獲得用戶和密碼 String username = (String)request.getAttribute("username"); String password = (String)request.getAttribute("password");
switch(gender){ case "1" : gender="男"; break; case "2" : gender="女"; break; }
switch(job){ case "1" : job="講師"; break; case "2" : job="構架師"; break; } //設置response的類型和編碼 response.setCharacterEncoding("UTF-8"); response.setContentType("text/html;charset=UTF-8"); //打印到頁面上 response.getWriter().println("<h1>註冊成功</h1>"); response.getWriter().println("<hr>"); response.getWriter().println("用戶名:"+username+"<br>"); response.getWriter().println("密碼:"+password+"<br>"); response.getWriter().println("性別:"+gender+"<br>"); response.getWriter().println("職位:"+job+"<br>"); //因爲當前servlet中的request是新的對象,所以是獲取不到上一個servlet的request屬性 //那麼用戶名和密碼打印爲null
}
} |
2 Cookie的示例
- 保存Cookie到客戶端
這是響應工作的一部分,所以這個方法是response對象的。並且Cookie是HTTP協議中的內容,所以保存Cookie是HttpServletResponse類的方法。
void addCookie(Cookie c):添加Cookie對象到當前response對象中,這個方法可以被調用多次,從而完成添加多個Cookie對象到response中。
public class AServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { Cookie c = new Cookie("name", "renliang"); response.addCookie(c); } } |
使用瀏覽器訪問http://localhost/day06_03/AServlet,然後通過HttpWatch查看響應頭信息中是否存在Set-Cookie這個頭信息。
當再交方法http://localhost/day07_03/AServlet時,查看請求頭信息中是否存在Cookie這個頭信息。當然也可以嘗試訪問http://localhost/day07_03/BServlet是否在請求頭中存在Cookie這個頭信息。
嘗試訪問http://localhost/day07_03/BServlet,你可能會說,BServlet不存在,沒錯,BServlet是不存在,但我們只關心請求,而不關心響應。我們只需要看看在請求中是否存在Cookie這個頭信息。你應該已經嘗試過了,也看到了Cookie請求頭信息。這說明不只是訪問AServlet纔會有Cookie請求頭信息,而是隻要訪問這個day07_03就會有Cookie這個請求頭。
Cookie的大小是有限的,瀏覽器最多可以保存300個Cookie,一個Cookie最多隻有4KB,如果超出最大容量就會報如下錯誤。
- 服務器端讀取Cookie
我們現在已經可以保存Cookie到客戶端了,但還沒有學習讓服務器如何讀取Cookie。
如果瀏覽器保存了Cookie,那麼會在下一次請求時把Cookie放到請求頭中發送給服務器,這時服務器需要在請求中讀取Cookie。既然是在請求中讀取,那麼當然是使用request對象來讀取了。
HttpServletRequest:Cookie[] getCookies()
注意,它返回的是Cookie數組,而不是一個Cookie對象。如果請求中沒有Cookie,那麼該方法返回null。
Cookie[] cs = request.getCookies(); if (cs != null) { for (Cookie c : cs) { String str = c.getName() + ": " + c.getValue() + "<br/>"; response.getWriter().print(str); } } |
Cookie存寫代碼示例:
RegistServlet存儲cookie
public class RegistServlet extends HttpServlet {
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("UTF-8"); //獲取用戶名和密碼 String username = request.getParameter("username"); String password = request.getParameter("password");
System.out.println("用戶名:"+username); System.out.println("密碼:"+password);
//創建cookie對象,將用戶名和密碼連接存儲,使用逗號分開 Cookie cookie = new Cookie("userpass", username+","+password);
//把cookie寫入瀏覽器 response.addCookie(cookie);
//跳轉頁面 request.getRequestDispatcher("/regist1.html").forward(request, response); }
} |
RegistServlet1讀取cookie
public class Regist1Servlet extends HttpServlet {
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //獲得性別 String gender = request.getParameter("gender"); //獲得職位 String job = request.getParameter("job");
//從瀏覽器中來讀取當前項目的所有cookie Cookie[] cookies = request.getCookies(); String userpassVal = null; //遍歷cookies for (Cookie cookie : cookies) { //獲取cookie的name String cookieName = cookie.getName(); if("userpass".equals(cookieName)){ //獲得cookie的值 userpassVal = cookie.getValue(); } }
String username = null; String password = null; if(userpassVal != null){ //將用戶密碼字符串進行分割 String[] upValues = userpassVal.split(","); //將分割後的字符串數組賦給相對應的用戶和密碼 username = upValues[0]; password = upValues[1]; }
switch(gender){ case "1" : gender="男"; break; case "2" : gender="女"; break; }
switch(job){ case "1" : job="講師"; break; case "2" : job="構架師"; break; } //設置response的類型和編碼 response.setCharacterEncoding("UTF-8"); response.setContentType("text/html;charset=UTF-8"); //打印到頁面上 response.getWriter().println("<h1>註冊成功</h1>"); response.getWriter().println("<hr>"); response.getWriter().println("用戶名:"+username+"<br>"); response.getWriter().println("密碼:"+password+"<br>"); response.getWriter().println("性別:"+gender+"<br>"); response.getWriter().println("職位:"+job+"<br>"); } } |
360瀏覽器查看存儲的cookie: