會話(狀態)管理Cookie與Session(一)
會話(狀態)管理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只能儲存字串。