1. 程式人生 > >會話(狀態)管理Cookie與Session(一)

會話(狀態)管理Cookie與Session(一)

會話(狀態)管理Cookie與Session(一)

目錄

  1. 什麼是會話?
  2. 儲存會話狀態的兩種技術
  3. Cookie應用
    a.Cookie執行原理
    b.建立Cookie

什麼是會話

會話可以簡單的理解為:使用者開啟瀏覽器訪問了多個資源,然後關閉瀏覽器。整個過程稱之為一次會話。
就像你去參加考試,監考老師要記錄你來參加過考試,這種對於資料的管理我們稱之為狀態的管理。
我們所說的會話管理其實就是之狀態管理,而狀態的管理其實就是對資料的管理!
而在整個會話的過程中不可避免的會產生一些資料(狀態)。程式要想辦法來儲存這些資料,但是瀏覽器傳送的是基於HTTP協議的請求,HTTP又是無狀態協議,所以我們要使用其他技術來完成狀態的管理。

儲存會話狀態的兩種技術

Cookie

Cookie是客戶端技術,資料儲存在客戶端,程式把每個使用者的資料以cookie的形式寫給使用者各自的瀏覽器。當用戶使用瀏覽器再去訪問伺服器中的web資源時,就會帶著各自的資料去。
例如:你去奶茶店買奶茶,奶茶店會有積分卡,你每消費一次給你改個章,這個卡你是拿走的,並不是放在奶茶店。下次你再來消費時把你的積分卡帶著即可。

Session

Session是伺服器端技術,資料儲存在伺服器端,伺服器在執行時為每一個使用者的瀏覽器建立一個其獨享的session物件,由於session為使用者瀏覽器獨享,所以使用者在訪問伺服器的web資源時,可以把各自的資料放在各自的session中,當用戶再去訪問伺服器中的其它web資源時,其它web資源再從使用者各自的session中取出資料為使用者服務。
例如:你去理髮店理髮辦了個VIP,你的個人資訊,餘額等都是存放在理髮店的系統中,你只要帶個VIP的號碼走即可,下次你來根據你的號碼可以找到你的資訊,無論你是剪頭染髮都可以。

Cookie應用

Cookie執行原理

1、當瀏覽器第一次訪問伺服器時,伺服器會產生一個Cookie物件
2、當伺服器向瀏覽器傳送響應時,會把cookie物件以訊息頭的形式傳送給瀏覽器,並儲存在記憶體或硬碟上(通過程式設定)
3、當瀏覽器再次向同一伺服器傳送請求時會附帶cookie資訊
4、伺服器可以得到cookie資訊進行處理

Cookie案例

使用Servlet API提拱的javax.servlet.http.Cookie
1、編寫一個servlet作為案例CookieServlet

@WebServlet(urlPatterns={"/cookie"})
public class CookieServlet
extends HttpServlet{ @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //設定Cookie 訊息頭是以name-value 名值對的形式存在的 Cookie cookie=new Cookie("city", "ShangHai"); //把cookie新增到響應物件上 resp.addCookie(cookie); } }

2、通過瀏覽器訪問,開啟開發者工具,檢視cookie
在這裡插入圖片描述

3、再次訪問伺服器,檢視傳送請求中的cookie

在這裡插入圖片描述

4、新建一個Servlet用於獲取檢視Cookie

@WebServlet(urlPatterns={"/getCookie"})
public class GetCookieServlet extends HttpServlet{

	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		//使用request獲取瀏覽器傳送的所有Cookie物件 該方法有可能返回null
		Cookie [] cookies=req.getCookies();
		//遍歷檢視
		for(Cookie cookie:cookies){
			System.out.println(cookie.getName()+":"+cookie.getValue());
		}
	}
}

5、修改Cookie
兩種方式
1)通過查詢到cookie物件,然後使用setValue(String value)
2)新建一個同名的cookie物件,同名cookie會被覆蓋

@WebServlet(urlPatterns={"/getCookie"})
public class GetCookieServlet extends HttpServlet{

	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		//使用request獲取瀏覽器傳送的所有Cookie物件 該方法有可能返回null
		Cookie [] cookies=req.getCookies();
		//遍歷檢視
		for(Cookie cookie:cookies){
			//第一種
			if(cookie.getName().equals("city")){
				cookie.setValue("HeFei");
			}
		}
		//第二種
		Cookie c=new Cookie("city","HeFei");
	}
}

Cookie的生存時間

預設情況下,瀏覽器會將Cookie儲存在記憶體中,只要瀏覽器不關閉, Cookie就一直存在
可以通過setMaxAge(int seconds)來設定過期時間 (單位為秒)
seconds>0:儲存cookie在硬碟上,如果超過了指定時間則瀏覽器會刪除此cookie
seconds=0:刪除cookie,即response響應完成後即刪除,可理解為不儲存
seconds<0:預設值,瀏覽器會將cookie儲存在記憶體中,即瀏覽器關閉則刪除
1、新建在CookieServlet中新增過期時間

@WebServlet(urlPatterns={"/cookie"})
public class CookieServlet extends HttpServlet{

   @Override
   protected void service(HttpServletRequest req, HttpServletResponse resp)
   		throws ServletException, IOException {
   	//設定Cookie 訊息頭是以name-value 名值對的形式存在的
   	Cookie cookie=new Cookie("city", "ShangHai");
   	//新增過期時間為一天
   	cookie.setMaxAge(24*60*60);
   	//把cookie新增到響應物件上
   	resp.addCookie(cookie);
   	
   	
   }
}

2、訪問並在瀏覽器的設定中檢視cookie的過期時間
谷歌瀏覽器:設定->高階->內容設定->cookie

在這裡插入圖片描述

檢視city的過期時間:

在這裡插入圖片描述

Cookie編碼

Cookie只能儲存合法的ASCII字元。如果要儲存中文,需要將中文 轉換成合法的ASCII字元,即編碼

 new  Cookie( “city”, URLEncoder.encoder(“上海”,”utf-8”));

編碼後的Cookie在檢視時要需要重新編碼
String value=URLDecoder.decode(cookie.getValue(),”utf-8”);
這裡就不做案例了

Cookie路徑問題

瀏覽器在訪問伺服器上的某個地址時,會比較Cookie的路徑與該路 徑是否匹配,要訪問的地址必須是Cookie的路徑或者其子路徑時,瀏覽器才會發 送Cookie
例如:你是北大的學生,辦了北大的校園卡,那麼你可以使用北大的校園卡在北大橫行,吃飯洗澡樣樣行,但是你想進清華的門進都進不去 !而如果你辦了北大的洗澡卡,那你又只能去洗澡,不能拿洗澡卡去吃飯。
如果想改變訪問路徑怎麼辦?可以使用cookie設定

cookie.setPath(url);

Cookie的限制

Cookie可以被使用者禁止
Cookie會將狀態儲存在瀏覽器端,不安全。
瀏覽器一般只允許存放300個Cookie,每個站點最多存放20個Cookie,每個Cookie的大小限制為4KB。
Cookie只能儲存字串。