狀態管理--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元件所在路徑