1:cookie的核心機制:
客戶端訪問服務器是會從cookie存儲區中查找是否有與該服務器對應的cookie信息,第一次訪問是是不存在的,此時服務器接到請求信息后會生成該客戶端與自己對應的唯一cookie,并放在響應頭中響應給客戶端,客戶端收到后會將cookie信息存儲到cookie存儲區中,當再次訪問時客戶端會將cookie存儲區中與該服務器對應的cookie取出一并請求過去,此時服務器就會認識此客戶端。
Cookie使用說明。1:會話級別的cookie,儲存在內存里,當瀏覽器關閉后在訪問,cookie消失
2:當利用方法setMaxAge(num)設置cookie的最大時效,將cookie進行持久化,
為0,則立即刪除,負數,不儲存,正數為存儲時間
客戶端第一次訪問服務器時,由于cookie儲存區中不存在cookie內容,所以第一次訪問的請求頭中沒有cookie信息:
第一次訪問服務器對應的請求頭內容:
此時服務器收到客戶端的請求信息后,服務器會生成該客戶端與自己對應的唯一cookie并將相應內容放到響應頭中返回給客戶端,此時客戶端會將對應服務器的cookie存放到cookie存儲區中,待下次訪問時進行調取:
服務器響應頭信息:
客戶端進行第二次或更多次訪問時:
此時請求頭對應的內容為:
服務器的相應信息:
核心代碼:(具體的cookie存取和設置,參考ServletAPI中的cookie,
地址:http://tomcat.apache.org/tomcat-5.5-doc/servletapi/index.html)
Cookie cookie=new Cookie("name","hi");
response.addCookie(cookie);
2:cookie模擬自動登錄:
登錄界面:
1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8" session="false"%> 3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 4 <html> 5 <head> 6 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 7 <title>Insert title here</title> 8 </head> 9 <body> 10 11 <form action="index.jsp" method="post"> 12 name:<input type="text" name="user"/> 13 <input type="submit" value="Submit"/> 14 </form> 15 16 </body> 17 </html>
用表單模擬服務器:
1 <%@page import="org.apache.tomcat.util.http.Cookies"%> 2 <%@ page language="java" contentType="text/html; charset=UTF-8" 3 pageEncoding="UTF-8" session="false"%> 4 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 5 <html> 6 <head> 7 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 8 <title>Insert title here</title> 9 </head> 10 <body> 11 <% 12 //獲取表單的參數 13 String name = request.getParameter("name"); 14 if(name != null && !name.trim().equals("")){ 15 //表單傳遞參數存在的時候,創建cookie,將數據放到cookie中 16 Cookie cookie = new Cookie("user",name); 17 //將cookie進行持久化,保存時間30秒 18 cookie.setMaxAge(30); 19 //服務器將cookie返回給客戶端 20 response.addCookie(cookie); 21 } 22 else{ 23 //從cookie中獲取 24 //當表單中沒有數據時 ,也就是說用戶沒有經過登錄界面,直接訪問登錄后才能訪問的信息時 25 //此時就要用cookie,查找cookie中的信息用,cookie中的信息進行登錄 26 Cookie[] cookies = request.getCookies(); 27 if(cookies != null && cookies.length>0){ 28 for(Cookie cookie : cookies){ 29 String userName=cookie.getName(); 30 if("user".equals(userName)){ 31 String val=cookie.getValue(); 32 //將對應的value值賦給request中的表單信息 33 name=val; 34 } 35 } 36 } 37 } 38 if(name != null && !name.trim().equals("")){ 39 out.print("Hello:"+name); 40 }else{ 41 response.sendRedirect("login.jsp"); 42 } 43 44 45 46 %> 47 </body> 48 </html>
?
3:利用cookie顯示最近瀏覽的商品:
利用界面作為服務器:
1 <%@page import="java.util.List"%> 2 <%@page import="java.util.ArrayList"%> 3 <%@ page language="java" contentType="text/html; charset=UTF-8" 4 pageEncoding="UTF-8"%> 5 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 6 <html> 7 <head> 8 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 9 <title>Insert title here</title> 10 </head> 11 <body> 12 13 BookName:<%=request.getParameter("name") %> 14 <br><br> 15 <a href="books.jsp">return</a> 16 17 18 <% 19 20 String book = request.getParameter("name"); 21 /*1: 確定要刪除的cookie */ 22 //把書的信息以cookie的方式傳回給瀏覽器,并刪除一個cookie 23 //確定要刪除的cookie 24 //前提是:以"YINFU_book_"開頭的cookie數量大于等于5個 25 Cookie[] cookies = request.getCookies(); 26 //用來保存所有以"YINFU_book_"開頭的cookie(即:要被瀏覽的cookie) 27 List<Cookie> bookCookies = new ArrayList<Cookie>(); 28 //用來保存和books.jsp傳入的book相匹配的那個cookie 29 Cookie tempCookie=null; 30 if(cookies != null && cookies.length>0){ 31 for(Cookie c : cookies){ 32 String cookieName=c.getName(); 33 if(cookieName.startsWith("YINFU_book_")){ 34 bookCookies.add(c); 35 if(c.getValue().equals(book)){ 36 tempCookie=c; 37 } 38 } 39 } 40 } 41 //當新傳入的book信息不再cookie中,則刪除第一個cookie 42 if(bookCookies.size() >= 5 && tempCookie==null){ 43 tempCookie = bookCookies.get(0); 44 } 45 //當傳入的book在cookie中,就將對應的cookie刪掉 46 if(tempCookie != null){ 47 //設置為0,則立即刪除該cookie 48 tempCookie.setMaxAge(0); 49 response.addCookie(tempCookie); 50 } 51 /* 2:把books.jsp傳入的book作為一個cookie返回 */ 52 Cookie cookie = new Cookie("YINFU_book_"+book, book ); 53 response.addCookie(cookie); 54 %> 55 56 </body> 57 </html>
顯示瀏覽過的商品界面:
1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 4 <html> 5 <head> 6 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 7 <title>Insert title here</title> 8 </head> 9 <body> 10 11 <a href="book.jsp?name=java">java</a><br> 12 <a href="book.jsp?name=php">php</a><br> 13 <a href="book.jsp?name=javascript">javascript</a><br> 14 <a href="book.jsp?name=jQuery">jQuery</a><br> 15 <a href="book.jsp?name=servlet">servlet</a><br> 16 <a href="book.jsp?name=ajax">ajax</a><br> 17 <a href="book.jsp?name=struts2">struts2</a><br> 18 <br><br> 19 <% 20 Cookie[] cookies = request.getCookies(); 21 if(cookies != null && cookies.length>0){ 22 for(Cookie c : cookies){ 23 String cookieName=c.getName(); 24 if(cookieName.startsWith("YINFU_book_")){ 25 out.println(c.getValue()); 26 } 27 } 28 } 29 %> 30 31 </body> 32 </html>
?