JavaWeb Cookie詳解
阿新 • • 發佈:2018-08-07
.com uri 識別 web服務 文本 pre red 文件 截圖
代碼地址如下:
http://www.demodashi.com/demo/12713.html
Cookie的由來
首先我們需要介紹一下,在Web開發過程中為什麽會引入Cookie。我們知道Http協議是一種無狀態協議,
Web服務器本身不能識別出哪些請求是同一個瀏覽器發出的,瀏覽器的每一次請求都是完全孤立的。
即便在Http1.1支持了持續連接,但當用戶有一段時間沒有提交請求時,連接也會自動關閉。這時,作為Web服務器,
必須采用一種機制來唯一標識一個用戶,同時記錄該用戶的狀態。於是就引入了第一種機制:Cookie機制。
Cookie機制: 采用的是在客戶端保持Http狀態的方案。
Cookie的定義即基本介紹
Cookie是在瀏覽器訪問WEB服務器的某個資源時,
由WEB服務器在HTTP響應消息頭中附帶傳送給瀏覽器的一個小文本文件。
- 一旦WEB瀏覽器保存了某個Cookie,
那麽它在以後每次訪問該WEB服務器時,
都會在HTTP請求頭中將這個Cookie回傳給WEB服務器。 - 一個Cookie只能標識一種信息,
它至少含有一個標識該信息的名稱(NAME)和設置值(VALUE)。 - 一個WEB站點可以給一個WEB瀏覽器發送多個Cookie,
一個WEB瀏覽器也可以存儲多個WEB站點提供的Cookie。 - 瀏覽器一般只允許存放300個Cookie,
每個站點最多存放20個Cookie,每個Cookie的大小限制為4KB。
Cookie的原理
底層的實現原理: WEB服務器通過在HTTP響應消息中增加Set-Cookie響應頭字段將Cookie信息發送給瀏覽器,
瀏覽器則通過在HTTP請求消息中增加Cookie請求頭字段將Cookie回傳給WEB服務器。
Cookie的傳送過程示意圖
Cookie 在JavaWeb中的使用
- Servlet API中提供了一個javax.servlet.http.Cookie類來封裝Cookie信息,它包含有生成Cookie信息和提取Cookie信息的各個屬性的方法。
- Cookie類的方法:
- 構造方法: public Cookie(String name,String value)
- getName方法
- setValue與getValue方法
- setMaxAge與getMaxAge方法
- setPath與getPath方法
- HttpServletResponse接口中定義了一個addCookie方法,它用於在發送給瀏覽器的HTTP響應消息中增加一個Set-Cookie響應頭字段。
- HttpServletRequest接口中定義了一個getCookies方法,它用於從HTTP請求消息的Cookie請求頭字段中讀取所有的Cookie項。
Cookie的發送
- 創建Cookie對象
- 設置最大時效
- 將Cookie放入到HTTP響應報頭
- 如果創建了一個cookie,並將他發送到瀏覽器,默認情況下它是一個會話級別的cookie; 存儲在瀏覽器的內存中,用戶退出瀏覽器之後被刪除。
若希望瀏覽器將該cookie存儲在磁盤上,則需要使用maxAge,並給出一個以秒為單位的時間。將最大時效設為0則是命令瀏覽器刪除該cookie。 - 發送cookie需要使用HttpServletResponse的addCookie方法,將cookie插入到一個 Set-Cookie HTTP響應報頭中。
由於這個方法並不修改任何之前指定的Set-Cookie報頭,而是創建新的報頭,因此將這個方法稱為是addCookie,而非setCookie。
- 如果創建了一個cookie,並將他發送到瀏覽器,默認情況下它是一個會話級別的cookie; 存儲在瀏覽器的內存中,用戶退出瀏覽器之後被刪除。
Cookie的讀取
- 調用request.getCookies要獲取瀏覽器發送來的cookie,需要調用HttpServletRequest的getCookies方法,
這個調用返回Cookie對象的數組,對應由HTTP請求中Cookie報頭輸入的值。 - 對數組進行循環,調用每個cookie的getName方法,直到找到感興趣的cookie為止。
會話cookie和持久cookie的區別
- 如果不設置過期時間,則表示這個cookie生命周期為瀏覽器會話期間,只要關閉瀏覽器窗口,cookie就消失了。
這種生命期為瀏覽器會話期的cookie被稱為會話cookie。
會話cookie一般不保存在硬盤上而是保存在內存裏。 - 如果設置了過期時間,瀏覽器就會把cookie保存到硬盤上,關閉後再次打開瀏覽器,這些cookie依然有效直到超過設定的過期時間。
設置過期時間: setMaxAge(param) param為具體的時間,單位為秒。 - 存儲在硬盤上的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
- 將代碼clone到本地,使用eclipse導入代碼,導入的時候項目的類型選擇"git project"。
- 右鍵項目 run on Server。
法二: 將項目中WebContent中的內容拷入你的Tomccat服務器下的webapps目錄下你建的站點名,
然後啟動tomcat服務器,
在瀏覽器中輸入: http://localhost:8080/站點名,即可訪問
Tomcat目錄下的webapps目錄如下:
站點頁面展示
項目文件結構截圖
JavaWeb Cookie詳解
代碼地址如下:
http://www.demodashi.com/demo/12713.html
註:本文著作權歸作者,由demo大師代發,拒絕轉載,轉載需要作者授權
JavaWeb Cookie詳解