Cookie & Session
(一)會(huì)話技術(shù)的概述
一奸绷、什么是會(huì)話
? ? 會(huì)話可以簡單理解為维蒙,用戶打開一個(gè)瀏覽器揩魂,點(diǎn)擊多個(gè)超鏈接訪問服務(wù)器的web資源熟吏,然后關(guān)閉瀏覽器,整個(gè)過程稱為是一次會(huì)話
二娶吞、為什么要學(xué)習(xí)會(huì)話
1垒迂、每個(gè)用戶與服務(wù)器進(jìn)行交互過程中,產(chǎn)生一些各自的數(shù)據(jù)妒蛇,程序想要把這些數(shù)據(jù)進(jìn)行保存机断,就需要使用會(huì)話技術(shù)
2、例如:用戶點(diǎn)擊超鏈接購買一個(gè)商品绣夺,程序應(yīng)該保存用戶所購買的商品吏奸,以便于用戶點(diǎn)擊結(jié)賬時(shí),可以得到用戶所購買的商品信息
3陶耍、思考:用戶購買的商品保存在Request或ServletContext中是否可以奋蔚?
答案:無論保存在Request或ServletContext中都不行
(二)會(huì)話技術(shù)的實(shí)現(xiàn)原理
一、會(huì)話技術(shù)分類
1物臂、Cookie技術(shù)
(1)Cookie是客戶端技術(shù)旺拉,程序把每個(gè)用戶的數(shù)據(jù)以cookie的形式保存到各自的瀏覽器中产上,
(2)當(dāng)用戶使用瀏覽器再次訪問服務(wù)器中的Web資源的時(shí)候棵磷,就會(huì)帶著各自的數(shù)據(jù)過去。
(3)這樣Web資源處理的就是用戶各自的數(shù)據(jù)了
2晋涣、Session技術(shù)
(1)Session是服務(wù)器端技術(shù)仪媒,利用這個(gè)技術(shù),服務(wù)器在運(yùn)行時(shí)為每一個(gè)用戶的瀏覽器創(chuàng)建一個(gè)獨(dú)享的Session對象。
(2)由于Session為用戶瀏覽器獨(dú)享算吩,所有用戶在訪問服務(wù)器的時(shí)候留凭,可以把各自的數(shù)據(jù)放在各自的Session中,
(3)當(dāng)用戶再次訪問服務(wù)器中的Web資源的時(shí)候偎巢,其他的Web資源再從用戶各自的Session中取出數(shù)據(jù)蔼夜,為用戶服務(wù)
二、會(huì)話技術(shù)的實(shí)現(xiàn)原理
1压昼、Cookie的實(shí)現(xiàn)原理
2求冷、Session的實(shí)現(xiàn)原理
(三)記錄用戶上次訪問時(shí)間的分析
分析需求和流程
(四)記錄用戶上次訪問時(shí)間的代碼實(shí)現(xiàn)
一、Cookie的簡單使用
1窍霞、獲得從瀏覽器帶過來的Cookie
? ? 通過HttpServletRequest對象中的方法:
?? ??? ?getCookies()
2匠题、向?yàn)g覽器回寫Cookie
? ? 通過HttpServletResponse對象中的方法:
?? ??? ?addCookie(Cookie cookie)
3、Cookie的構(gòu)造
? ??Cookie(String name, String value)
二但金、案例代碼實(shí)現(xiàn)
? ? 創(chuàng)建一個(gè)Web項(xiàng)目
創(chuàng)建包結(jié)構(gòu)
? ? 代碼實(shí)現(xiàn)
?? ?? ? 編寫工具類
?? ?? ? 編寫Servlet
(五)Cookie的分類
一韭山、案例存在問題
問題描述:
? ? 用戶訪問Servlet,記錄用戶的上次訪問時(shí)間冷溃,但是如果用戶將瀏覽器關(guān)閉钱磅,再重新打開瀏覽器訪問程序,程序就會(huì)把其當(dāng)成是第一次訪問的用戶(顯示:您好似枕,歡迎來到本網(wǎng)站)
二续搀、Cookie的分類
1、默認(rèn)級別的Cookie
指的是沒有設(shè)置有效時(shí)間的Cookie菠净,默認(rèn)的情況下禁舷,只要關(guān)閉了瀏覽器,Cookie也會(huì)被銷毀(Cookie存在于瀏覽器的內(nèi)存中毅往,當(dāng)關(guān)閉了瀏覽器牵咙,Cookie就銷毀了)
2、持久級別的Cookie
指的是具有有效時(shí)間的Cookie攀唯,這種Cookie的內(nèi)容不是保存在瀏覽器的內(nèi)存中洁桌,而是將Cookie的內(nèi)容保存(持久化)到硬盤上。當(dāng)關(guān)閉瀏覽器侯嘀,再次打開時(shí)另凌,會(huì)加載硬盤上的文件,從而Cookie中的數(shù)據(jù)就不會(huì)丟失
(六)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的有效時(shí)長:setMaxAge(int expiry)
三、代碼改進(jìn)
案例問題解決
(七)Cookie的使用細(xì)節(jié)
1诗茎、一個(gè)Cookie只能標(biāo)識一種信息工坊,至少含有一個(gè)標(biāo)識該信息的名稱和值(即鍵值對)
2、一個(gè)web站點(diǎn)可以給一個(gè)瀏覽器發(fā)送多個(gè)Cookie,一個(gè)Web瀏覽器也可以存儲(chǔ)多個(gè)Web站點(diǎn)的Cookie
3王污、老版本瀏覽器一般只允許存放300個(gè)Cookie罢吃,每個(gè)站點(diǎn)最多可以存放20個(gè)Cookie,每個(gè)Cookie的大小限制為4KB昭齐,瀏覽器存放的Cookie的大小和個(gè)數(shù)是有限制的
4尿招、如果創(chuàng)建了一個(gè)Cookie,并發(fā)送到瀏覽器阱驾,默認(rèn)情況下泊业,它是一個(gè)會(huì)話級別的Cookie,用戶退出瀏覽器就被刪除了
5啊易、如果希望將這個(gè)Cookie存到磁盤上吁伺,需要設(shè)置有效時(shí)長,就要調(diào)用setMaxAge(int expiry)方法租谈,以秒為單位
6篮奄、需要手動(dòng)刪除持久性Cookie的話,可以將Cookie的有效時(shí)長設(shè)置為0割去,必須注意:刪除Cookie的時(shí)候窟却,path必須一致,否則無法刪除
(八)Session的概述
一呻逆、什么是Session
1夸赫、Session稱為是一次會(huì)話,Cookie將用戶產(chǎn)生的私有的數(shù)據(jù)保存到瀏覽器端咖城,Session將用戶產(chǎn)生的私有的數(shù)據(jù)保存到服務(wù)器端
2茬腿、注意:一個(gè)瀏覽器獨(dú)占一個(gè)Session對象。因此宜雀,在需要保存用戶數(shù)據(jù)的時(shí)候切平,服務(wù)器程序可以將用戶數(shù)據(jù)寫到Session對象中,當(dāng)用戶使用瀏覽器訪問其他程序時(shí)辐董,其他程序可以從用戶的Session中取出該用戶的數(shù)據(jù)悴品,為用戶服務(wù)
二、為什么有Cookie還要有Session
1简烘、Cookie的局限性
Cookie保存的數(shù)據(jù)是有個(gè)數(shù)和大小的限制的
數(shù)據(jù)是保存在客戶端瀏覽器上的(相對不是很安全)
2苔严、Session的優(yōu)勢
Session沒有個(gè)數(shù)和大小的限制
數(shù)據(jù)是保存在服務(wù)器上的(相對比較安全)
三、Session如何保存用戶數(shù)據(jù)
Session對象由服務(wù)器創(chuàng)建孤澎,開發(fā)人員可以調(diào)用request對象的getSession方法得到Session對象
(九)Session的實(shí)現(xiàn)原理
一届氢、Session的實(shí)現(xiàn)原理分析
服務(wù)器是如何實(shí)現(xiàn)一個(gè)Session為一個(gè)用戶瀏覽器服務(wù)的?
二亥至、Session的實(shí)現(xiàn)原理:
? ? 基于Cookie的悼沈,基于Cookie回寫了一個(gè)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ū)ο笮豕饔梅秶褪且淮螘?huì)話的范圍,一次會(huì)話茶敏,指的是用戶打開瀏覽器壤靶,點(diǎn)擊多個(gè)超鏈接,訪問服務(wù)器資源惊搏,到最后關(guān)閉瀏覽器的過程
(十一)Servlet的域?qū)ο髷?shù)據(jù)訪問范圍的總結(jié)
一贮乳、請求范圍(ServletRequest)
1、何時(shí)創(chuàng)建和銷毀的
? ? 創(chuàng)建:當(dāng)用戶服務(wù)器發(fā)送一次請求恬惯,服務(wù)器創(chuàng)建一個(gè)Request對象
? ? 銷毀:當(dāng)服務(wù)器對這次請求作出了響應(yīng)向拆,服務(wù)器就會(huì)銷毀這個(gè)Request對象
2、如何存取數(shù)據(jù)
? ? 存數(shù)據(jù)
?? ?? ? void setAttribute(String name, Object value);
? ? 取數(shù)據(jù)
?? ?? ? Object getAttribute(String name);
3酪耳、作用范圍
范圍是一次請求(轉(zhuǎn)發(fā)就是一次請求)
二浓恳、會(huì)話范圍(HttpSession)
1、何時(shí)創(chuàng)建和銷毀的
? ? 創(chuàng)建:服務(wù)器端第一次調(diào)用getSession()方法的時(shí)候
? ? 銷毀:三種情況
?? ?? ? Session過期碗暗,默認(rèn)的過期時(shí)間是30分鐘
?? ?? ? 非正常關(guān)閉服務(wù)器(正常關(guān)閉服務(wù)器時(shí)颈将,Session會(huì)被序列化)
?? ?? ? 手動(dòng)調(diào)用session.invalidate()
2、如何存取數(shù)據(jù)
? ? 存數(shù)據(jù)
?? ?? ? void setAttribute(String name, Object value);
? ? 取數(shù)據(jù)
?? ?? ? Object getAttribute(String name);
3言疗、作用范圍
范圍是一次會(huì)話(多次請求)
三晴圾、應(yīng)用范圍(ServletContext)
1、何時(shí)創(chuàng)建和銷毀的
? ? 創(chuàng)建:服務(wù)器啟動(dòng)的時(shí)候就創(chuàng)建了噪奄,會(huì)為每個(gè)Web項(xiàng)目創(chuàng)建一個(gè)單獨(dú)的ServletContext對象
? ? 銷毀:服務(wù)器關(guān)閉的時(shí)候死姚,或者項(xiàng)目人服務(wù)器中移除的時(shí)候
2、如何存取數(shù)據(jù)
? ? 存數(shù)據(jù)
?? ?? ? void setAttribute(String name, Object value);
? ? 取數(shù)據(jù)
?? ?? ? Object getAttribute(String name);
3勤篮、作用范圍
范圍是整個(gè)應(yīng)用的范圍