會話技術(shù)
從打開一個瀏覽器訪問某個站點馆类,到關(guān)閉這個瀏覽器的整個過程逗威,成為一次會話。會話技術(shù)就是記錄這次會話中客戶端的狀態(tài)與數(shù)據(jù)的。
會話技術(shù)分為Cookie和Session:
- Cookie:數(shù)據(jù)存儲在客戶端本地京革,減少服務(wù)器端的存儲的壓力,安全性不好冠跷,客戶端 可以清除cookie
- Session:將數(shù)據(jù)存儲到服務(wù)器端合是,安全性相對好,增加服務(wù)器的壓力
功能
在一次會話的范圍內(nèi)的多次請求間飒赃,共享數(shù)據(jù)
方式
- 客戶端會話技術(shù):Cookie
- 服務(wù)器端會話技術(shù):Session
Cookie——客戶端會話技術(shù)
Cookie技術(shù)是將用戶的數(shù)據(jù)存儲到客戶端的會話技術(shù)利花,我們分為兩方面學(xué)習(xí):
- 第一,服務(wù)器端怎樣將一個Cookie發(fā)送到客戶端
-
第二载佳,服務(wù)器端怎樣接受客戶端攜帶的Cookie
基本使用
- 創(chuàng)建Cookie對象炒事,綁定數(shù)據(jù)
new Cookie(String name,String value)
- 發(fā)送Cookie對象
response.addCookie(Cookie cookie)
- 獲取Cookie,拿到數(shù)據(jù)
Cookie[] request.getCookies()
服務(wù)器端向客戶端發(fā)送一個Cookie
創(chuàng)建Cookie:
Cookie cookie = new Cookie(String cookieName,String cookieValue);
示例:
Cookie cookie = new Cookie("username"蔫慧,"zhangsan");
那么該cookie會以響應(yīng)頭的形式發(fā)送給客戶端:
//1挠乳、創(chuàng)建cookie對象
Cookie cookie = new Cookie("name","zhangsan");
//1.1 為cookie設(shè)置持久化時間 ---- cookie信息在硬盤上保存的時間
cookie.setMaxAge(10*60);//10分鐘 ---- 時間設(shè)置為0代表刪除該cookie
//1.2 為cookie設(shè)置攜帶的路徑
//cookie.setPath("/WEB16/sendCookie");//訪問sendCookie資源時才攜帶這個cookie
cookie.setPath("/WEB16");//訪問WEB16下的任何資源時都攜帶這個cookie
//cookie.setPath("/");//訪問服務(wù)器下的所有的資源都攜帶這個cookie
//2、將cookie中存儲的信息發(fā)送到客戶端---頭
response.addCookie(cookie);
設(shè)置Cookie在客戶端的持久化時間:
cookie.setMaxAge(int seconds); ---時間秒
注意:
如果不設(shè)置持久化時間姑躲,cookie會存儲在瀏覽器的內(nèi)存中睡扬,瀏覽器關(guān)閉cookie信息銷毀(會話級別的cookie),如果設(shè)置持久化時間肋联,cookie信息會被持久化到瀏覽器的磁盤文件里
示例:
cookie.setMaxAge(10*60);
設(shè)置cookie信息在瀏覽器的磁盤文件中存儲的時間是10分鐘威蕉,過期瀏覽器自動刪除該cookie信息
參數(shù)意義:
1 正數(shù):將cookie數(shù)據(jù)寫到硬盤的文件中。持久化存儲
2 負(fù)數(shù):默認(rèn) 瀏覽器關(guān)閉即銷毀
3 零:刪除cookie信息
Cookie共享問題
- 假設(shè)在一個tomcat服務(wù)器中橄仍,部署了多個web項目韧涨,那么在這個服務(wù)器中這些web項目cookie能不能共享?
- 默認(rèn)情況下cookie不能共享
- setPath(String path) 設(shè)置cookie的獲取范圍 默認(rèn)情況下侮繁,設(shè)置當(dāng)前虛擬目錄
Cookie的特點和作用
- cookie是存儲在客戶端
- 瀏覽器對于單個cookie的大小有限制(4kb)以及對同一個域名下的總cookie數(shù)量也有限制
Cookie存中文問題
- tomcat7前不支持 需要使用URL編碼
- tomcat8 支持中文 特殊字符需要使用URL編碼
作用
- cookie一般用于存儲少量的不太敏感的數(shù)據(jù)
設(shè)置Cookie的攜帶路徑:
cookie.setPath(String path);
注意:如果不設(shè)置攜帶路徑虑粥,那么該cookie信息會在訪問產(chǎn)生該cookie的web資源所在的路徑都攜帶cookie信息
示例:
cookie.setPath("/WEB16");
代表訪問WEB16應(yīng)用中的任何資源都攜帶cookie
cookie.setPath("/WEB16/cookieServlet");
代表訪問WEB16中的cookieServlet時才攜帶cookie信息
向客戶端發(fā)送cookie:
response.addCookie(Cookie cookie);
刪除客戶端的cookie:
如果想刪除客戶端的已經(jīng)存儲的cookie信息,那么就使用同名同路徑的持久化時 間為0的cookie進行覆蓋即可
步驟
- 置空cookie的值
- 設(shè)置相同path path不同代表不同的cookie
- 設(shè)置cookie的時間為0
- 發(fā)送cookie到客戶端
//刪除客戶端保存 name=zhangsan的cookie信息
Cookie cookie = new Cookie("name","");
//將path設(shè)置成與要刪除cookie的path一致
cookie.setPath("/WEB16");
//設(shè)置時間是0
cookie.setMaxAge(0);
response.addCookie(cookie);
服務(wù)器端怎么接受客戶端攜帶的Cookie
cookie信息是以請求頭的方式發(fā)送到服務(wù)器端的:
//獲得客戶端攜帶的cookie的數(shù)據(jù)
Cookie[] cookies = request.getCookies();
//Cookie cookie = new Cookie("name","zhangsan");
//通過cookie名稱獲得想要的cookie
if(cookies!=null){
for(Cookie cookie : cookies){
//獲得cookie的名稱
String cookieName = cookie.getName();
if(cookieName.equals("name")){
//獲得該cookie的值
String cookieValue = cookie.getValue();
System.out.println(cookieValue);
}
}
}
1)通過request獲得所有的Cookie:
Cookie[] cookies = request.getCookies();
遍歷Cookie數(shù)組宪哩,通過Cookie的名稱獲得我們想要的Cookie
//獲取cookie
Cookie[] cookies = request.getCookies();
for (Cookie cookie : cookies) {
if (cookie.getName().equals("name")) {
String value = cookie.getValue();//獲取對應(yīng)name的cookie的值
int maxAge = cookie.getMaxAge();//獲取對應(yīng)name的cookie的有效時間
String path = cookie.getPath();//獲取對應(yīng)name的cookie的路徑
}
}
Session技術(shù) 服務(wù)器端會話技術(shù)
Session技術(shù)是將數(shù)據(jù)存儲在服務(wù)器端的技術(shù)
服務(wù)器會為每個客戶端都創(chuàng)建一塊內(nèi)存空間存儲客戶的數(shù)據(jù)娩贷,但客戶端需要每次都攜帶一個標(biāo)識ID去服務(wù)器中尋找屬于自己的內(nèi)存空間。所以說Session的實現(xiàn)是基于Cookie锁孟,Session需要借助于Cookie存儲客 戶的唯一性標(biāo)識JSESSIONID
獲得Session對象
HttpSession session = request.getSession();
此方法會獲得專屬于當(dāng)前會話的Session對象彬祖,如果服務(wù)器端沒有該會話的Session 對象會創(chuàng)建一個新的Session返回茁瘦,如果已經(jīng)有了屬于該會話的Session直接將已有的Session返回(實質(zhì)就是根據(jù)JSESSIONID判斷該客戶端是否在服務(wù)器上已經(jīng)存在session了)
一個客戶端在服務(wù)器只能創(chuàng)建一個session
服務(wù)器如何確保在一次會話范圍內(nèi) 多次獲取的session對象是同一個對象?
Seesion的實現(xiàn)是依賴于Cookie的
怎樣向session中存取數(shù)據(jù)(session也是一個域?qū)ο螅?/h2>
Session也是存儲數(shù)據(jù)的區(qū)域?qū)ο蟠⑿Γ詓ession對象也具有如下三個
方法:
- session.setAttribute(String name,Object obj);
- session.getAttribute(String name);
- session.removeAttribute(String name);
Session的細(xì)節(jié)
- 當(dāng)客戶端關(guān)閉甜熔,服務(wù)器不關(guān)閉 獲取的Session是同一個嗎?
默認(rèn)情況下不是突倍,可以創(chuàng)建Cookie指定JSESSIONID 來使得Session相同
Cookie cookie = new Cookie("JSESSIONID",session.getId());
cookie.setMaxAge(60*60);
response.addCookie(cookie);
- 當(dāng)客戶端關(guān)閉腔稀,服務(wù)器關(guān)閉,兩次獲取的Session是同一個嗎羽历?
服務(wù)器關(guān)閉后焊虏,內(nèi)存釋放,存儲在服務(wù)器端的session也會被銷毀秕磷,所以兩次獲取的Session不是同一個
但是我們應(yīng)該確保數(shù)據(jù)不丟失- session的鈍化:
- 在服務(wù)器正常關(guān)閉之前诵闭,將session對象序列化到硬盤上
- session的活化:
- 在服務(wù)器啟動后,將session文件轉(zhuǎn)化為內(nèi)存中的session對象即可
- session的鈍化:
- Session的失效時間
Session對象的生命周期
創(chuàng)建:第一次執(zhí)行request.getSession()時創(chuàng)建
銷毀:
- 服務(wù)器(非正常)關(guān)閉時
- session過期/失效(默認(rèn)30分鐘)
- session調(diào)用invalidate() 自我銷毀
問題:時間的起算點 從何時開始計算30分鐘跳夭?
從不操作服務(wù)器端的資源開始計時
可以在工程的web.xml中進行配置
<session-config>
<session-timeout>30</session-timeout>
</session-config>
手動銷毀session
session.invalidate();
作用范圍:
默認(rèn)在一次會話中涂圆,也就是說在们镜,一次會話中任何資源公用一個session對象
瀏覽器關(guān)閉币叹,session就銷毀了? 不對
Seesion的特點
- session用于存儲一次會話的多次請求數(shù)據(jù)模狭,存在服務(wù)器端
- session可以存儲任意類型颈抚,任意大小的數(shù)據(jù)
session與cookie的區(qū)別
- session存儲數(shù)據(jù)在服務(wù)器端 cookie在客戶端
- session沒有數(shù)據(jù)大小的限制,cookie有
- session數(shù)據(jù)安全嚼鹉,cookie相對不安全