天天看點

會話(狀态)管理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

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

3、再次通路伺服器,檢視發送請求中的cookie

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

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

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

檢視city的過期時間:

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

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隻能儲存字元串。

下一章Session講解

https://blog.csdn.net/qq_34598667/article/details/83016178