Java Web如何操作Cookie的新增修改和刪除

hu19930613發表於2017-04-30

一、Cookie是什麼

Cookie是伺服器存放在客戶端瀏覽器上的一些小資料,可以使用Cookie完成與伺服器的一些互動動作。伺服器可以通過HTTP響應頭將Cookie傳送給瀏覽器,而瀏覽器如果支援儲存Cookie,則將HTTP響應頭資訊中的Cookie內容存放到瀏覽器中。當瀏覽器請求訪問一個網站時,如果這個網站在此瀏覽器中存放有Cookie內容,瀏覽器會將Cookie內容附加到HTTP請求頭資訊中傳送給伺服器。鑑於此,Cookie存放的內容是不宜過多的,一般瀏覽器也是這樣規定的。

瀏覽器應該支援每臺 Web 伺服器有 20 個 cookie,總共有 300 個 cookie,並且可能將每個 cookie 的大小限定為 4 KB。

二、Servlet如何建立Cookie物件

Java Web提供了一個Cookie類:javax.servlet.http.Cookie

建立Cookie物件

Cookie是一個類似於鍵值對的資料,通過Cookie的構造方法Cookie(String name, String value)建立一個Cookie物件,不過Cookie與鍵值對資料不同的一點兒是,儲存在瀏覽器中的Cookie物件可以擁有相同的name值,這點兒在後面獲取Cookie物件的時候需要特別注意。

修改Cookie值

建立好Cookie物件後,我們可以通過setValue(String newValue)方法修改值,通過getValue()獲取值。

新增Cookie描述

為了方便客戶端使用者檢視Cookie資訊,可以通過setComment(String purpose)方法設定一個描述資訊,Cookie還沒有傳送前,通過getComment()方法獲取描述資訊。

設定Cookie有效期和刪除Cookie

存放在客戶端的Cookie是有有效期的,可以通過setMaxAge(int expiry)方法設定這個Cookie可以儲存好長時間,單位為秒,這是一個時間長度,不是一個時間點Timestamp。如果沒有設定有效期,則預設為-1(或者說小於0的值),表示在瀏覽器關閉時就刪除Cookie內容,如果有效期設定為0,則表示通知瀏覽器立即刪除這個Cookie。

設定Cookie作用範圍和域

我們還可以指定Cookie在哪個網頁才有效,通過setPath(String uri)方法即可設定,如果值為“/”表示作用範圍為整個網站,預設是這個值。

另外還可以指定這個Cooke對其他網站有效(也就是不同的域),通過setDomain(String pattern)方法來實現,不過需要注意的是,一般瀏覽器是不允許一個網站設定另外網站的Cookie內容的,所以這個用處不大。實在要做,就需要修改瀏覽器的配置才行。

Cookie中文問題

Cookie有一點兒不好的就是不支援中文,這點兒一定要注意了,如果忘Cookie中新增了中文內容,則系統會丟擲異常內容:

java.lang.IllegalArgumentException: Control character in cookie value, consider BASE64 encoding your value

如果確實需要寫入中文,則需要進行BASE64轉碼才行。在讀取Cookie的時候又需要進行反轉碼。

三、如何向客戶端寫入Cookie

前面說了,Cookie寫入瀏覽器是通過HTTP響應頭帶入的。在Java Web開發中Response物件已經幫我們完成了這個工作,通過Response的addCookie(Cookie cookie)方法就可以向瀏覽器寫入Cookie內容了。一個響應頭可以帶入多個Cookie,所以這個方法也可以多次呼叫,一次寫入多個Cookie。

四、獲取客戶端傳送來的Cookie

跟向瀏覽器寫入Cookie相反,客戶端通過HTTP請求頭將Cookie帶入傳送給伺服器。通過Request.getCookies()方法可以獲取到從客戶端傳送來的Cookie陣列。不過從瀏覽器傳送過來的Cookie物件只有name屬性和value屬性,其他有效期,有效路徑等都是沒有的。而且可以有多個相同的name屬性的,所以判斷是不是我們需要的Cookie需要審慎的。

五、實現程式碼

新增Cookie:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 1.建立Cookie物件
        Cookie cookie1 = new Cookie("webname", "XCoder Studio");
        // 2.配置Cookie物件
        cookie1.setComment("Web Host Name");    // Cookie描述
        cookie1.setMaxAge(24*60*60);            // Cookie有效時間
        //cookie1.setPath("/");                 // Cookie有效路徑

        // 3.通過response物件將Cookie寫入瀏覽器,當然需要解決中文亂碼問題,否則會丟擲異常
        // java.lang.IllegalArgumentException: Control character in cookie value, consider BASE64 encoding your value
        response.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=UTF-8");
        response.addCookie(cookie1);

        // 跳轉到首頁
        response.sendRedirect("./index.jsp");
    }

 

 

讀取Cookie:

 

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // 讀取Cookie,通過request請求讀取Cookie
    Cookie[] cookies = request.getCookies();

    // 判斷是否存在Cookie,不存在跳轉到首頁
    if (cookies == null) {
        response.sendRedirect("./index.jsp");
        return;
    }

    // 處理輸出中文亂碼問題
    response.setCharacterEncoding("UTF-8");
    response.setContentType("text/html;charset=UTF-8");
    // 獲取輸出物件
    PrintWriter out = response.getWriter();
    // 迭代處理客戶端傳送來的Cookie物件

    for (Cookie cookie:cookies) {
        out.println("Cookie名   稱:"+cookie.getName()+"<br />");
        out.println("Cookie儲   值:"+cookie.getValue()+"<br />");
        out.println("Cookie備   注:"+cookie.getComment()+"<br />");
        out.println("Cookie有效時間:"+cookie.getMaxAge()+"<br />");
        out.println("Cookie有效路徑:"+cookie.getPath()+"<br />");
        out.println("Cookie有效域名:"+cookie.getDomain()+"<br />");
        out.println("<a href=\"./CookieDel?name="+cookie.getName()+"\">刪除Cookie</a><br />");
        out.println("---------------------------------------------------------<br />");
    }
}

刪除Cookie:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // 獲取GET傳遞引數名稱
    String delName = request.getParameter("name");
    if (delName == null) {
        response.sendRedirect("./CookieRead");
        return;
    }

    // 獲取Cookies陣列
    Cookie[] cookies = request.getCookies();
    // 迭代查詢並清除Cookie
    for (Cookie cookie: cookies) {
        if (delName.equals(cookie.getName())) {
            cookie.setMaxAge(0);
            response.addCookie(cookie);
        }
    }

    response.setHeader("refresh", "3;./CookieRead");
    PrintWriter out = response.getWriter();
    out.println("Will go back after 3 seconds...");
}

執行會發現讀取Cookie時,所以的有效時間都是Null的。

 

相關文章