? ? ? ? Cookie & Session
(一)會話技術(shù)的概述
一空骚、什么是會話
? ? 會話可以簡單理解為彬犯,用戶打開一個瀏覽器,點擊多個超鏈接訪問服務(wù)器的web資源兰吟,然后關(guān)閉瀏覽器杭跪,整個過程稱為是一次會話
二仙逻、為什么要學(xué)習(xí)會話
1、每個用戶與服務(wù)器進行交互過程中揍魂,產(chǎn)生一些各自的數(shù)據(jù)桨醋,程序想要把這些數(shù)據(jù)進行保存棚瘟,就需要使用會話技術(shù)
2现斋、例如:用戶點擊超鏈接購買一個商品,程序應(yīng)該保存用戶所購買的商品偎蘸,以便于用戶點擊結(jié)賬時庄蹋,可以得到用戶所購買的商品信息
3、思考:用戶購買的商品保存在Request或ServletContext中是否可以迷雪?
答案:無論保存在Request或ServletContext中都不行
(二)會話技術(shù)的實現(xiàn)原理
一限书、會話技術(shù)分類
1、Cookie技術(shù)
(1)Cookie是客戶端技術(shù)章咧,程序把每個用戶的數(shù)據(jù)以cookie的形式保存到各自的瀏覽器中倦西,
(2)當(dāng)用戶使用瀏覽器再次訪問服務(wù)器中的Web資源的時候,就會帶著各自的數(shù)據(jù)過去赁严。
(3)這樣Web資源處理的就是用戶各自的數(shù)據(jù)了
2扰柠、Session技術(shù)
(1)Session是服務(wù)器端技術(shù)粉铐,利用這個技術(shù),服務(wù)器在運行時為每一個用戶的瀏覽器創(chuàng)建一個獨享的Session對象卤档。
(2)由于Session為用戶瀏覽器獨享蝙泼,所有用戶在訪問服務(wù)器的時候,可以把各自的數(shù)據(jù)放在各自的Session中劝枣,
(3)當(dāng)用戶再次訪問服務(wù)器中的Web資源的時候汤踏,其他的Web資源再從用戶各自的Session中取出數(shù)據(jù),為用戶服務(wù)
二舔腾、會話技術(shù)的實現(xiàn)原理
1溪胶、Cookie的實現(xiàn)原理
2、Session的實現(xiàn)原理
(三)記錄用戶上次訪問時間的分析
分析需求和流程
(四)記錄用戶上次訪問時間的代碼實現(xiàn)
一稳诚、Cookie的簡單使用
1载荔、獲得從瀏覽器帶過來的Cookie
? ? 通過HttpServletRequest對象中的方法:
? ? ? ? getCookies()
2、向瀏覽器回寫Cookie
? ? 通過HttpServletResponse對象中的方法:
? ? ? ? addCookie(Cookie cookie)
3采桃、Cookie的構(gòu)造
? ? Cookie(String name, String value)
二懒熙、案例代碼實現(xiàn)
? ? 創(chuàng)建一個Web項目
創(chuàng)建包結(jié)構(gòu)
? ? 代碼實現(xiàn)
? ? ? ? 編寫工具類
? ? ? ? 編寫Servlet
(五)Cookie的分類
一、案例存在問題
問題描述:
? ? 用戶訪問Servlet普办,記錄用戶的上次訪問時間工扎,但是如果用戶將瀏覽器關(guān)閉,再重新打開瀏覽器訪問程序衔蹲,程序就會把其當(dāng)成是第一次訪問的用戶(顯示:您好肢娘,歡迎來到本網(wǎng)站)
二、Cookie的分類
1舆驶、默認級別的Cookie
指的是沒有設(shè)置有效時間的Cookie橱健,默認的情況下,只要關(guān)閉了瀏覽器沙廉,Cookie也會被銷毀(Cookie存在于瀏覽器的內(nèi)存中拘荡,當(dāng)關(guān)閉了瀏覽器,Cookie就銷毀了)
2撬陵、持久級別的Cookie
指的是具有有效時間的Cookie珊皿,這種Cookie的內(nèi)容不是保存在瀏覽器的內(nèi)存中,而是將Cookie的內(nèi)容保存(持久化)到硬盤上巨税。當(dāng)關(guān)閉瀏覽器蟋定,再次打開時,會加載硬盤上的文件草添,從而Cookie中的數(shù)據(jù)就不會丟失
(六)Cookie的API的概述
一驶兜、構(gòu)造方法
? ? Cookie(String name, String value)
? ? 需要傳入字符串類型的名稱和值
二、其他的方法
? ? 獲得Cookie的名稱:getName()
? ? 獲得Cookie的值:getValue()
? ? 設(shè)置Cookie的有效域名:setDomain(String domain)
? ? 設(shè)置Cookie的有效路徑:setPath(String uri)
? ? 設(shè)置Cookie的有效時長:setMaxAge(int expiry)
三、代碼改進
案例問題解決
(七)Cookie的使用細節(jié)
1抄淑、一個Cookie只能標(biāo)識一種信息犀盟,至少含有一個標(biāo)識該信息的名稱和值(即鍵值對)
2、一個web站點可以給一個瀏覽器發(fā)送多個Cookie蝇狼,一個Web瀏覽器也可以存儲多個Web站點的Cookie
3阅畴、老版本瀏覽器一般只允許存放300個Cookie,每個站點最多可以存放20個Cookie迅耘,每個Cookie的大小限制為4KB贱枣,瀏覽器存放的Cookie的大小和個數(shù)是有限制的
4、如果創(chuàng)建了一個Cookie颤专,并發(fā)送到瀏覽器纽哥,默認情況下,它是一個會話級別的Cookie栖秕,用戶退出瀏覽器就被刪除了
5春塌、如果希望將這個Cookie存到磁盤上,需要設(shè)置有效時長簇捍,就要調(diào)用setMaxAge(int expiry)方法只壳,以秒為單位
6、需要手動刪除持久性Cookie的話暑塑,可以將Cookie的有效時長設(shè)置為0吼句,必須注意:刪除Cookie的時候,path必須一致事格,否則無法刪除
(八)Session的概述
一惕艳、什么是Session
1、Session稱為是一次會話驹愚,Cookie將用戶產(chǎn)生的私有的數(shù)據(jù)保存到瀏覽器端远搪,Session將用戶產(chǎn)生的私有的數(shù)據(jù)保存到服務(wù)器端
2、注意:一個瀏覽器獨占一個Session對象逢捺。因此谁鳍,在需要保存用戶數(shù)據(jù)的時候,服務(wù)器程序可以將用戶數(shù)據(jù)寫到Session對象中蒸甜,當(dāng)用戶使用瀏覽器訪問其他程序時棠耕,其他程序可以從用戶的Session中取出該用戶的數(shù)據(jù),為用戶服務(wù)
二柠新、為什么有Cookie還要有Session
1、Cookie的局限性
Cookie保存的數(shù)據(jù)是有個數(shù)和大小的限制的
數(shù)據(jù)是保存在客戶端瀏覽器上的(相對不是很安全)
2辉巡、Session的優(yōu)勢
Session沒有個數(shù)和大小的限制
數(shù)據(jù)是保存在服務(wù)器上的(相對比較安全)
三恨憎、Session如何保存用戶數(shù)據(jù)
Session對象由服務(wù)器創(chuàng)建,開發(fā)人員可以調(diào)用request對象的getSession方法得到Session對象
(九)Session的實現(xiàn)原理
一、Session的實現(xiàn)原理分析
服務(wù)器是如何實現(xiàn)一個Session為一個用戶瀏覽器服務(wù)的憔恳?
二瓤荔、Session的實現(xiàn)原理:
? ? 基于Cookie的,基于Cookie回寫了一個Session的ID
(十)Session作為域?qū)ο蟠嫒?shù)據(jù)
一钥组、Session作為域?qū)ο蟮腁PI
? ? 向Session中存入數(shù)據(jù)
? ? ? ? setAttribute(String name, Object value)
? ? 從Session域中獲取數(shù)據(jù)
? ? ? ? getAttribute(String name)
? ? 從Session域中移除數(shù)據(jù)
? ? ? ? removeAttribute(String name)
二输硝、Session作為域?qū)ο蟮淖饔梅秶?/p>
? ? Session作為域?qū)ο螅饔梅秶褪且淮螘挼姆秶堂危淮螘挼惆眩傅氖怯脩舸蜷_瀏覽器,點擊多個超鏈接屿附,訪問服務(wù)器資源郎逃,到最后關(guān)閉瀏覽器的過程
(十一)Servlet的域?qū)ο髷?shù)據(jù)訪問范圍的總結(jié)
一、請求范圍(ServletRequest)
1挺份、何時創(chuàng)建和銷毀的
? ? 創(chuàng)建:當(dāng)用戶服務(wù)器發(fā)送一次請求褒翰,服務(wù)器創(chuàng)建一個Request對象
? ? 銷毀:當(dāng)服務(wù)器對這次請求作出了響應(yīng),服務(wù)器就會銷毀這個Request對象
2匀泊、如何存取數(shù)據(jù)
? ? 存數(shù)據(jù)
? ? ? ? void setAttribute(String name, Object value);
? ? 取數(shù)據(jù)
? ? ? ? Object getAttribute(String name);
3优训、作用范圍
范圍是一次請求(轉(zhuǎn)發(fā)就是一次請求)
二、會話范圍(HttpSession)
1各聘、何時創(chuàng)建和銷毀的
? ? 創(chuàng)建:服務(wù)器端第一次調(diào)用getSession()方法的時候
? ? 銷毀:三種情況
? ? ? ? Session過期型宙,默認的過期時間是30分鐘
? ? ? ? 非正常關(guān)閉服務(wù)器(正常關(guān)閉服務(wù)器時,Session會被序列化)
? ? ? ? 手動調(diào)用session.invalidate()
2伦吠、如何存取數(shù)據(jù)
? ? 存數(shù)據(jù)
? ? ? ? void setAttribute(String name, Object value);
? ? 取數(shù)據(jù)
? ? ? ? Object getAttribute(String name);
3妆兑、作用范圍
范圍是一次會話(多次請求)
三、應(yīng)用范圍(ServletContext)
1毛仪、何時創(chuàng)建和銷毀的
? ? 創(chuàng)建:服務(wù)器啟動的時候就創(chuàng)建了搁嗓,會為每個Web項目創(chuàng)建一個單獨的ServletContext對象
? ? 銷毀:服務(wù)器關(guān)閉的時候,或者項目人服務(wù)器中移除的時候
2箱靴、如何存取數(shù)據(jù)
? ? 存數(shù)據(jù)
? ? ? ? void setAttribute(String name, Object value);
? ? 取數(shù)據(jù)
? ? ? ? Object getAttribute(String name);
3腺逛、作用范圍
范圍是整個應(yīng)用的范圍