JavaWeb Cookie詳解


代碼地址如下:
http://www.demodashi.com/demo/12713.html

Cookie的由來

首先我們需要介紹一下,在Web開發過程中為什么會引入Cookie。我們知道Http協議是一種無狀態協議,
Web服務器本身不能識別出哪些請求是同一個瀏覽器發出的,瀏覽器的每一次請求都是完全孤立的。
即便在Http1.1支持了持續連接,但當用戶有一段時間沒有提交請求時,連接也會自動關閉。這時,作為Web服務器,
必須采用一種機制來唯一標識一個用戶,同時記錄該用戶的狀態。於是就引入了第一種機制:Cookie機制。

Cookie機制: 采用的是在客戶端保持Http狀態的方案。

Cookie的定義即基本介紹

Cookie是在瀏覽器訪問WEB服務器的某個資源時,
由WEB服務器在HTTP響應消息頭中附帶傳送給瀏覽器的一個小文本文件。

  1. 一旦WEB瀏覽器保存了某個Cookie,
    那么它在以后每次訪問該WEB服務器時,
    都會在HTTP請求頭中將這個Cookie回傳給WEB服務器。
  2. 一個Cookie只能標識一種信息,
    它至少含有一個標識該信息的名稱(NAME)和設置值(VALUE)。
  3. 一個WEB站點可以給一個WEB瀏覽器發送多個Cookie,
    一個WEB瀏覽器也可以存儲多個WEB站點提供的Cookie。
  4. 瀏覽器一般只允許存放300個Cookie,
    每個站點最多存放20個Cookie,每個Cookie的大小限制為4KB。

Cookie的原理

底層的實現原理: WEB服務器通過在HTTP響應消息中增加Set-Cookie響應頭字段將Cookie信息發送給瀏覽器,
瀏覽器則通過在HTTP請求消息中增加Cookie請求頭字段將Cookie回傳給WEB服務器。

Cookie的傳送過程示意圖

  1. Servlet API中提供了一個javax.servlet.http.Cookie類來封裝Cookie信息,它包含有生成Cookie信息和提取Cookie信息的各個屬性的方法。
  2. Cookie類的方法:
    • 構造方法: public Cookie(String name,String value)
    • getName方法
    • setValue與getValue方法
    • setMaxAge與getMaxAge方法
    • setPath與getPath方法
  3. HttpServletResponse接口中定義了一個addCookie方法,它用於在發送給瀏覽器的HTTP響應消息中增加一個Set-Cookie響應頭字段。
  4. HttpServletRequest接口中定義了一個getCookies方法,它用於從HTTP請求消息的Cookie請求頭字段中讀取所有的Cookie項。

Cookie的發送

  1. 創建Cookie對象
  2. 設置最大時效
  3. 將Cookie放入到HTTP響應報頭
    • 如果創建了一個cookie,並將他發送到瀏覽器,默認情況下它是一個會話級別的cookie; 存儲在瀏覽器的內存中,用戶退出瀏覽器之后被刪除。
      若希望瀏覽器將該cookie存儲在磁盤上,則需要使用maxAge,並給出一個以秒為單位的時間。將最大時效設為0則是命令瀏覽器刪除該cookie。
    • 發送cookie需要使用HttpServletResponse的addCookie方法,將cookie插入到一個 Set-Cookie HTTP響應報頭中。
      由於這個方法並不修改任何之前指定的Set-Cookie報頭,而是創建新的報頭,因此將這個方法稱為是addCookie,而非setCookie。

Cookie的讀取

  1. 調用request.getCookies要獲取瀏覽器發送來的cookie,需要調用HttpServletRequest的getCookies方法,
    這個調用返回Cookie對象的數組,對應由HTTP請求中Cookie報頭輸入的值。
  2. 對數組進行循環,調用每個cookie的getName方法,直到找到感興趣的cookie為止。

會話cookie和持久cookie的區別

  1. 如果不設置過期時間,則表示這個cookie生命周期為瀏覽器會話期間,只要關閉瀏覽器窗口,cookie就消失了。
    這種生命期為瀏覽器會話期的cookie被稱為會話cookie。
    會話cookie一般不保存在硬盤上而是保存在內存里。
  2. 如果設置了過期時間,瀏覽器就會把cookie保存到硬盤上,關閉后再次打開瀏覽器,這些cookie依然有效直到超過設定的過期時間。
    設置過期時間: setMaxAge(param) param為具體的時間,單位為秒。
  3. 存儲在硬盤上的cookie可以在不同的瀏覽器進程間共享,
    比如兩個IE窗口。而對於保存在內存的cookie,不同的瀏覽器有不同的處理方式。

具體實現

實現自動登錄過程

//正常登錄進入該頁面,name是存在的
		String name = request.getParameter("name");
		String check = request.getParameter("checked");
		if(name == null || name.equals("")){
			//判斷cookie存不存在
			Cookie[] cookies = request.getCookies();
			if(cookies != null && cookies.length > 0){
				for(Cookie cookie : cookies){
					String cookieName = cookie.getName();
					if(cookieName.equalsIgnoreCase("demoname")){
						name = cookie.getValue();
						break;
					}
				}	
			}
			//不存在說明cookie過期或者非法訪問,否則輸出正確內容
			if(name == null || name.equals("")){
				response.sendRedirect("demo1.jsp");	
			}
			else{
				Cookie cookie = new Cookie("demoname",name);
				cookie.setMaxAge(60);
				response.addCookie(cookie);//設置持久化cookie,存儲在磁盤中
				out.println("hello " + name + "\n");
				out.println(System.currentTimeMillis());
			}
		}else{
			if(check != null && check.equalsIgnoreCase("on")){
				Cookie cookie = new Cookie("demoname",name);
				cookie.setMaxAge(60);//設置持久化cookie
				response.addCookie(cookie);
			}
			out.println("hello " + name + "\n");
			out.println(System.currentTimeMillis());
		}

實現最近瀏覽記錄功能

//把書的信息以 Cookie 方式傳回給瀏覽器,刪除一個 Cookie
        //1. 確定要被刪除的 Cookie: tommyyangcn開頭的 Cookie數量大於或等於 5,
        //且若從 books.jsp 頁面傳入的 book不在 tommyyangcn開頭的 Cookie集合中則刪除較早的那個 Cookie(tommyyangcn開頭的Cookie集合的第一個 Cbookie),若在其中,則刪除該 Cookie
        //2. 把從 books.jsp 傳入的 book 作為一個 Cookie 返回

	    final String cookieFinalName = "tommyyangcn"; 
		//使用List(隊列機制)存儲cookie,第一個是訪問時間最久的
	    List<Cookie> bookList = new ArrayList<Cookie>();
		String bookName = request.getParameter("bookName");
		out.print("歡迎在線觀看:" + bookName);
		Cookie[] cookies = request.getCookies();
		Cookie tempCookie = null;
		if(cookies != null && cookies.length > 0){
			for(Cookie cookie : cookies){		
				String thisCookieName = cookie.getName();
				//填充cookie的存儲空間
				if(thisCookieName.startsWith(cookieFinalName)){
					bookList.add(cookie);
				}
				//看當前書籍是否在cookie數組中
				if(cookie.getValue().equals(bookName)){
					tempCookie = cookie;	
				}
			}
		}
		//說明當前書籍不在cookie數組中,則將當前書籍加入最近瀏覽的cookie數組中,同時刪除訪問時間最久的書籍,對於list集合來說,即第一個
		if(tempCookie == null && bookList.size() > 0){
			tempCookie = bookList.get(0);
		}
		//tommyyangcn開頭的 Cookie數量大於或等於 5,刪除需要刪除的那個cookie,即tempCookie
		if(bookList.size() >= 5 && tempCookie != null){
			tempCookie.setMaxAge(0);
			response.addCookie(tempCookie);
		}
		
		Cookie cookie = new Cookie(cookieFinalName + bookName, bookName);
		response.addCookie(cookie);

How to run code

  1. 將代碼clone到本地,使用eclipse導入代碼,導入的時候項目的類型選擇"git project"。
  2. 右鍵項目 run on Server。

法二: 將項目中WebContent中的內容拷入你的Tomccat服務器下的webapps目錄下你建的站點名,
然后啟動tomcat服務器,
在瀏覽器中輸入: http://localhost:8080/站點名,即可訪問

Tomcat目錄下的webapps目錄如下:

站點頁面展示

項目文件結構截圖

JavaWeb Cookie詳解

代碼地址如下:
http://www.demodashi.com/demo/12713.html

注:本文著作權歸作者,由demo大師代發,拒絕轉載,轉載需要作者授權


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM