1.8.1 Cookie

Cookie是透過client端來保持狀態的解決方案. 從定義上來看, Cookie就是由server發給client的特殊訊息, 而這些訊息以text file的方式存放在client, 而client每次向server發出request的時候都會帶上這些特殊訊息. 換個說法: 當使用者透過瀏覽器存取一個支持Cookie的網站的時候, 使用者會提供包括用戶名在內的私人訊息並且傳送至server; 接著, server在向client回傳相應的超文字的同時也會送回這些私人訊息, 而這些訊息不會存放在HTTP response body中, 它們會被存放在HTTP response header中; 當client端的瀏覽器收到response之後, 瀏覽器會將這些訊息存放在一個統一的位置, 以OSX來說, safari瀏覽器會把cookie放在"~/Library/Cookies"這個資料夾下; 自此, client再度向server發出請求的時候, 都會把相應的Coockie再次發回至server. 不過這次Cookie訊息則會被存放在HTTP request header中了.

有了Cookie這樣的技術後, server在接收到來自client的request之後, 就能夠通過分析存放於request header中的Cookie進而得到client特有的訊息, 從而動態生成與該client相對應的內容. 試著回想一下, 你可能在很多網站的登入頁面都看過"記住我"這樣的選項, 如果你勾選了它之後再登入, 那麼在下一次訪問該網站的時候就不需要進行重複的登入動作了, 這功能基本上就是透過Cookie實現的.

在Servlet中可以透過Cookie類別來建立Cookie:

Cookie cookie = new Cookie("user", "RuRu");
cookie.setMaxAge(7 * 24 * 60 * 60); // 一星期內有效
response.addCookie(cookie);

HTTP中Cookie的設定是透過set-cookie header,所以必須在實際回覆瀏覽器之前使用addCookie()來新增Cookie實例, 在瀏覽器輸出HTML回應之後再執行addCookie()是沒有作用的.

若要取得client端上儲存的Coockie, 則可以透過HttpServletRequest的getCookies(), 如此就可以取得屬於該網頁所屬domain的所有Cookie, 所以回傳值是一個Cookie[] array, 使用方法如下:

Cookie[] cookies = request.getCookies();
if(cookies != null) {
    for(Cookie cookie : cookies) {
        String name = cookie.getName();
        String value = cookie.getValue();
        ...
    }
}

Last updated