1. 程式人生 > >Servlet Cookie 處理

Servlet Cookie 處理

Cookie 是儲存在客戶端計算機上的文字檔案,並保留了各種跟蹤資訊。Java Servlet 顯然支援 HTTP Cookie。

識別返回使用者包括三個步驟:

伺服器指令碼向瀏覽器傳送一組 Cookie。例如:姓名、年齡或識別號碼等。
瀏覽器將這些資訊儲存在本地計算機上,以備將來使用。
當下一次瀏覽器向 Web 伺服器傳送任何請求時,瀏覽器會把這些 Cookie 資訊傳送到伺服器,伺服器將使用這些資訊來識別使用者。

本章將向您講解如何設定或重置 Cookie,如何訪問它們,以及如何將它們刪除。

Servlet Cookie 處理需要對中文進行編碼與解碼,方法如下:

String   str   =   java.net.URLEncoder.encode("中文","UTF-8");            //編碼
String   str   =   java.net.URLDecoder.decode("編碼後的字串","UTF-8");   // 解碼

Cookie 剖析
Cookie 通常設定在 HTTP 頭資訊中(雖然 JavaScript 也可以直接在瀏覽器上設定一個 Cookie)。設定 Cookie 的 Servlet 會發送如下的頭資訊:
在這裡插入圖片描述

正如您所看到的,Set-Cookie 頭包含了一個名稱值對、一個 GMT 日期、一個路徑和一個域。名稱和值會被 URL 編碼。expires 欄位是一個指令,告訴瀏覽器在給定的時間和日期之後"忘記"該 Cookie。

如果瀏覽器被配置為儲存 Cookie,它將會保留此資訊直到到期日期。如果使用者的瀏覽器指向任何匹配該 Cookie 的路徑和域的頁面,它會重新發送 Cookie 到伺服器。瀏覽器的頭資訊可能如下所示:
在這裡插入圖片描述
Servlet 就能夠通過請求方法 request.getCookies() 訪問 Cookie,該方法將返回一個 Cookie 物件的陣列。

通過 Servlet 設定 Cookie 包括三個步驟:
(1) 建立一個 Cookie 物件:您可以呼叫帶有 cookie 名稱和 cookie 值的 Cookie 建構函式,cookie 名稱和 cookie 值都是字串。

Cookie cookie = new Cookie("key","value");

(2) 設定最大生存週期:您可以使用 setMaxAge 方法來指定 cookie 能夠保持有效的時間(以秒為單位)。下面將設定一個最長有效期為 24 小時的 cookie。

cookie.setMaxAge(60*60*24); 

(3) 傳送 Cookie 到 HTTP 響應頭:您可以使用 response.addCookie 來新增 HTTP 響應頭中的 Cookie,如下所示:

response.addCookie(cookie);
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
    {
        // 為名字和姓氏建立 Cookie      
        Cookie name = new Cookie("name",
                URLEncoder.encode(request.getParameter("name"), "UTF-8")); // 中文轉碼
        Cookie url = new Cookie("url",
                      request.getParameter("url"));
        
        // 為兩個 Cookie 設定過期日期為 24 小時後
        name.setMaxAge(60*60*24); 
        url.setMaxAge(60*60*24); 
        
        // 在響應頭中新增兩個 Cookie
        response.addCookie( name );
        response.addCookie( url );
        
        // 設定響應內容型別
        response.setContentType("text/html;charset=UTF-8");
        
        PrintWriter out = response.getWriter();
        String title = "設定 Cookie 例項";
        String docType = "<!DOCTYPE html>\n";
        out.println(docType +
                "<html>\n" +
                "<head><title>" + title + "</title></head>\n" +
                "<body bgcolor=\"#f0f0f0\">\n" +
                "<h1 align=\"center\">" + title + "</h1>\n" +
                "<ul>\n" +
                "  <li><b>站點名:</b>:"
                + request.getParameter("name") + "\n</li>" +
                "  <li><b>站點 URL:</b>:"
                + request.getParameter("url") + "\n</li>" +
                "</ul>\n" +
                "</body></html>");
        }

通過 Servlet 讀取 Cookie
要讀取 Cookie,您需要通過呼叫 HttpServletRequest 的 getCookies( ) 方法建立一個 javax.servlet.http.Cookie 物件的陣列。然後迴圈遍歷陣列,並使用 getName() 和 getValue() 方法來訪問每個 cookie 和關聯的值。

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
    {
        Cookie cookie = null;
        Cookie[] cookies = null;
        // 獲取與該域相關的 Cookie 的陣列
        cookies = request.getCookies();
         
         // 設定響應內容型別
         response.setContentType("text/html;charset=UTF-8");
    
         PrintWriter out = response.getWriter();
         String title = "Delete Cookie Example";
         String docType = "<!DOCTYPE html>\n";
         out.println(docType +
                   "<html>\n" +
                   "<head><title>" + title + "</title></head>\n" +
                   "<body bgcolor=\"#f0f0f0\">\n" );
          if( cookies != null ){
            out.println("<h2>Cookie 名稱和值</h2>");
            for (int i = 0; i < cookies.length; i++){
               cookie = cookies[i];
               if((cookie.getName( )).compareTo("name") == 0 ){
                    cookie.setMaxAge(0);
                    response.addCookie(cookie);
                    out.print("已刪除的 cookie:" + 
                                 cookie.getName( ) + "<br/>");
               }
               out.print("名稱:" + cookie.getName( ) + ",");
               out.print("值:" +  URLDecoder.decode(cookie.getValue(), "utf-8") +" <br/>");
            }
         }else{
             out.println(
               "<h2 class=\"tutheader\">No Cookie founds</h2>");
         }
         out.println("</body>");
         out.println("</html>");
        }

刪除 Cookie 是非常簡單的。如果您想刪除一個 cookie,那麼您只需要按照以下三個步驟進行:
1、讀取一個現有的 cookie,並把它儲存在 Cookie 物件中。
2、使用 setMaxAge() 方法設定 cookie 的年齡為零,來刪除現有的 cookie。
3、把這個 cookie 新增到響應頭。