1. 程式人生 > >JavaWeb Cookie詳解

JavaWeb Cookie詳解

.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響應消息頭中附帶傳送給瀏覽器的一個小文本文件。

  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大師代發,拒絕轉載,轉載需要作者授權

JavaWeb Cookie詳解