會話技術(shù)(Cookie和Session)是幫助服務(wù)器記住客戶端狀態(tài)(區(qū)分客戶端)
存儲客戶端的狀態(tài)
由一個問題引出今天的內(nèi)容,例如網(wǎng)站的購物系統(tǒng),用戶將購買的商品信息存儲到哪 里?因?yàn)镠ttp協(xié)議是無狀態(tài)的,也就是說每個客戶訪問服務(wù)器端資源時,服務(wù)器并 不知道該客戶端是誰,所以需要會話技術(shù)識別客戶端的狀態(tài)。會話技術(shù)是幫助服務(wù)器 記住客戶端狀態(tài)(區(qū)分客戶端)
會話技術(shù)
從打開一個瀏覽器訪問某個站點(diǎn),到關(guān)閉這個瀏覽器的整個過程,成為一次會話。會 話技術(shù)就是記錄這次會話中客戶端的狀態(tài)與數(shù)據(jù)的。
會話技術(shù)分為Cookie和Session:
Cookie:數(shù)據(jù)存儲在客戶端本地,減少服務(wù)器端的存儲的壓力,安全性不好,客戶端 可以清除cookie
Session:將數(shù)據(jù)存儲到服務(wù)器端,安全性相對好,增加服務(wù)器的壓力
Cookie技術(shù)
Cookie技術(shù)是將用戶的數(shù)據(jù)存儲到客戶端的技術(shù),我們分為兩方面學(xué)習(xí):
第一,服務(wù)器端怎樣將一個Cookie發(fā)送到客戶端
第二,服務(wù)器端怎樣接受客戶端攜帶的Cookie
服務(wù)器端向客戶端發(fā)送一個Cookie
創(chuàng)建Cookie:
Cookie cookie = new Cookie(String cookieName,String cookieValue);
示例:
Cookie cookie = new Cookie("username","zhangsan");
那么該cookie會以響應(yīng)頭的形式發(fā)送給客戶端:
注意:Cookie中不能存儲中文
設(shè)置Cookie在客戶端的持久化時間:
cookie.setMaxAge(int seconds); ---時間秒
注意:如果不設(shè)置持久化時間,cookie會存儲在瀏覽器的內(nèi)存中,瀏覽器關(guān)閉 cookie信息銷毀(會話級別的cookie),如果設(shè)置持久化時間,cookie信息會 被持久化到瀏覽器的磁盤文件里
示例:
cookie.setMaxAge(30*60);
設(shè)置cookie信息在瀏覽器的磁盤文件中存儲的時間是30分鐘,時間到了,瀏覽器會自動刪除該cookie信息
設(shè)置Cookie的攜帶路徑:
cookie.setPath(String path);
注意:如果不設(shè)置攜帶路徑,那么該cookie信息會在訪問產(chǎn)生該cookie的 web資源所在的路徑都攜帶cookie信息
示例:
cookie.setPath("/WEB");
代表訪問WEB應(yīng)用中的任何資源都攜帶cookie
cookie.setPath("/WEB/cookieServlet");
代表訪問WEB中的cookieServlet時才攜帶cookie信息
向客戶端發(fā)送cookie:
response.addCookie(cookie);
刪除客戶端的cookie:
如果想刪除客戶端的已經(jīng)存儲的cookie信息,那么就使用同名同路徑的持久化時 間為0的cookie進(jìn)行覆蓋即可
服務(wù)器端怎么接受客戶端攜帶的Cookie
注意:cookie信息是以請求頭的方式發(fā)送到服務(wù)器端的:
通過request獲得所有的Cookie:
Cookie[] cookies = request.getCookies();
遍歷Cookie數(shù)組,通過Cookie的名稱獲得我們想要的Cookie
for(Cookie cookie : cookies){
if(cookie.getName().equal(cookieName)){
String cookieValue = cookie.getValue();
}
}
Session技術(shù)
Session技術(shù)是將數(shù)據(jù)存儲在服務(wù)器端的技術(shù),會為每個客戶端都創(chuàng)建一塊內(nèi)存空間 存儲客戶的數(shù)據(jù),但客戶端需要每次都攜帶一個標(biāo)識ID去服務(wù)器中尋找屬于自己的內(nèi) 存空間。所以說Session的實(shí)現(xiàn)是基于Cookie,Session需要借助于Cookie存儲客 戶的唯一性標(biāo)識JSESSIONID
學(xué)習(xí)目標(biāo):
- 怎樣獲得屬于本客戶端的session對象(內(nèi)存區(qū)域)?
- 怎樣向session中存取數(shù)據(jù)(session也是一個域?qū)ο螅?/li>
- session對象的生命周期 ?
獲得Session對象
HttpSession session = request.getSession();
此方法會獲得專屬于當(dāng)前會話的Session對象,如果服務(wù)器端沒有該會話的Session 對象會創(chuàng)建一個新的Session返回,如果已經(jīng)有了屬于該會話的Session直接將已有 的Session返回(實(shí)質(zhì)就是根據(jù)JSESSIONID判斷該客戶端是否在服務(wù)器上已經(jīng)存在 session了,其實(shí)第一次客戶端沒有JSESSIONID)
怎樣向session中存取數(shù)據(jù)(session也是一個域?qū)ο螅?/h2>
Session也是存儲數(shù)據(jù)的區(qū)域?qū)ο?,所以session對象也具有如下三個方法:
- session.setAttribute(String name,Object obj);
- session.getAttribute(String name);
- session.removeAttribute(String name);
Session對象的生命周期(面試題/筆試題)
創(chuàng)建:
第一次執(zhí)行request.getSession()時創(chuàng)建
銷毀:
1)服務(wù)器(非正常)關(guān)閉時(兩種說法都是對的)
2)session過期/失效(默認(rèn)30分鐘)
問題:時間的起算點(diǎn) 從何時開始計(jì)算30分鐘?
從不操作服務(wù)器端的資源開始計(jì)時
可以在工程的web.xml中進(jìn)行配置
<session-config>
<session-timeout>30</session-timeout>
</session-config>
3)手動銷毀session
session.invalidate();
作用范圍:
默認(rèn)在一次會話中,也就是說在,一次會話中任何資源公用一個session對象
面試題例子:
瀏覽器關(guān)閉,session就銷毀了?
不對
總結(jié):
重點(diǎn):整個會話過程的具體過程
Session
會話技術(shù):
Cookie技術(shù):存到客戶端
發(fā)送cookie
Cookie cookie = new Cookie(name,value)
cookie.setMaxAge(秒)
cookie.setPath()
response.addCookie(cookie)
獲得cookie
Cookie[] cookies = request.getCookies();
cookie.getName();
cookie.getValue();
Session技術(shù):
存到服務(wù)器端 ,借助cookie存儲JSESSIONID
HttpSession session = request.getSession();
setAttribute(name,value);
getAttribute(name);
session生命周期
創(chuàng)建:第一次指定request.getSession();
銷毀:服務(wù)器關(guān)閉、session失效/過期、手動session.invalidate();
session作用范圍:默認(rèn)一會話中