會話(狀态)管理Cookie與Session(一)
目錄
- 什麼是會話?
- 儲存會話狀态的兩種技術
-
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隻能儲存字元串。
下一章Session講解
https://blog.csdn.net/qq_34598667/article/details/83016178