1. 程式人生 > >狀態管理--Cookie

狀態管理--Cookie

狀態管理 1) 什麼是狀態管理 - 將瀏覽器與web伺服器之間多次互動當作一個整體來看待,並且將多次互動涉及到的資料(即狀態)儲存下來. 2) 如何進行狀態管理? - 將狀態儲存在瀏覽器端(Cookie) - 將狀態儲存在伺服器端(Session) 3) Cookie (1)什麼是Cookie? - 伺服器臨時存在瀏覽器端的少量資料,用於跟蹤使用者的狀態 (2) Cookie的工作原理 - 當瀏覽器訪問伺服器時,伺服器會將少量資料以`set-cookie`訊息頭的方式傳送給瀏覽器,瀏覽器會將這些資料臨時儲存下來,當瀏覽器再次訪問伺服器時,會將這些資料以`cookie`訊息頭的方式傳送給伺服器. (3) Cookie的新增(伺服器將cookie傳送給瀏覽器,response響應物件的方法)  

    Cookie cookie = new Cookie(String name , String value);//name:value只能存放字串,名字:值;
    response.addCookie(cookie);//將Cookie物件作為引數

(4) Cookie的獲取(request請求物件的方法)     

    Cookie[] cookies = request.getCookies();
    //首先進行判斷,不為空的時候才可以進行遍歷操作,因為可能一個Cookie也沒有
    String name = cookie.getName();
    String value = cookie.getValue();

 (5) Cookie的生存時間     - 預設情況下,瀏覽器會將Cookie儲存在記憶體中,瀏覽器關閉,則Cookie會被刪除.  

        cookie.setMaxAge(int seconds);
        注:    
            a:單位是s;
            b:當seconds>0,瀏覽器將Cookie儲存在硬碟上,當超時,cookie刪除
              當seconds<0,瀏覽器會將Cookie儲存在記憶體中,預設值
              當seconds=0,瀏覽器會立即刪除cookie;
                SUN公司提供的Cookie的API中沒有提供直接刪除cookie的方法
                    比如:要刪除一個名稱為"username"的cookie:
                    Cookie c = new Cookie("username","");
                    c.setMaxAge(0);
                    response.setCookie(c);    

                    練習: - 寫一個Servlet,該Servlet先檢視有沒有一個名稱為"cart"的Cookie,如果有,則顯示該Cookie的值,如果沒有,則新增該Cookie         

        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();
        Cookie[] cookies = request.getCookies();
        if(cookies != null){
            boolean flag = false;
            for(Cookie cookie : cookies){
                String name = cookie.getName();
                if("cart".equals(name)){
                    String value = cookie.getValue();
                    out.println("<h2>已經存在名為cart的Cookie:"+value + "</h2>");
                    flag = true;
                }
            }
            if(!flag){
                Cookie newCookie = new Cookie("cart", "123");
                response.addCookie(newCookie);
                out.println("<h1>已經新增名為cart的Cookie</h1>");
            }
        }else{
            Cookie newCookie = new Cookie("cart", "123");
            response.addCookie(newCookie);
            out.println("<h1>已經新增名為cart的Cookie</h1>");
        }

(6) Cookie的編碼問題 - 什麼是Cookie的編碼問題?     Cookie只能存放合法的ASCII碼字元,中文需要轉換成合法的ASCII碼字元形式才能存放!(Tomcat高本版已經經過處理)     設定Cookie的時候URL編碼             

 String URLEncoder.encode(String str , String charset);

    讀取Cookie的時候URL解碼             

 String URLDecoder.decode(String str , String charset);

建議:不管是否為中文,最好統一進行編碼,避免不合法的ASCII碼字元      (7) Cookie的路徑問題 - 什麼是Cookie的路徑     瀏覽器訪問伺服器會比較請求地址是否與Cookie的路徑匹配,只有匹配的Cookie才會被髮送出去. - Cooki的預設路徑     Cookie的預設路徑 = 新增該Cookie的元件(Servlet/JSP)路徑                  比如:/day06/biz01/addCookie.jsp添加了一個cookie,則該cookie的路徑為/day06/biz01      匹配規則:請求路徑(地址)必須等於Cookie的路徑或者是Cookie的子路徑     比如,cookie的路徑是"/day06/biz01",則訪問如下地址         /day06/findCookie1.jsp  no         /day06/biz01/findCookie2.jsp yes         /day06/biz01/sub/findCookie3.jsp yes - 修改Cookie的路徑

 cookie.setPath(String path);//預設路徑為web元件所在路徑