2020-03-20

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?day12? ? ? ? ? ?Cookie & Session


(一)會話技術(shù)的概述


一、什么是會話


? ? 會話可以簡單理解為,用戶打開一個瀏覽器,點(diǎn)擊多個超鏈接訪問服務(wù)器的web資源,然后關(guān)閉瀏覽器,整個過程稱為是一次會話


二、為什么要學(xué)習(xí)會話


1、每個用戶與服務(wù)器進(jìn)行交互過程中,產(chǎn)生一些各自的數(shù)據(jù),程序想要把這些數(shù)據(jù)進(jìn)行保存,就需要使用會話技術(shù)


2、例如:用戶點(diǎn)擊超鏈接購買一個商品,程序應(yīng)該保存用戶所購買的商品,以便于用戶點(diǎn)擊結(jié)賬時,可以得到用戶所購買的商品信息


3、思考:用戶購買的商品保存在Request或ServletContext中是否可以?


答案:無論保存在Request或ServletContext中都不行


(二)會話技術(shù)的實(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ù)器在運(yùn)行時為每一個用戶的瀏覽器創(chuàng)建一個獨(dú)享的Session對象。

(2)由于Session為用戶瀏覽器獨(dú)享,所有用戶在訪問服務(wù)器的時候,可以把各自的數(shù)據(jù)放在各自的Session中,

(3)當(dāng)用戶再次訪問服務(wù)器中的Web資源的時候,其他的Web資源再從用戶各自的Session中取出數(shù)據(jù),為用戶服務(wù)


二、會話技術(shù)的實(shí)現(xiàn)原理


1、Cookie的實(shí)現(xiàn)原理


2、Session的實(shí)現(xiàn)原理


(三)記錄用戶上次訪問時間的分析


分析需求和流程


(四)記錄用戶上次訪問時間的代碼實(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)建一個Web項(xiàng)目

創(chuàng)建包結(jié)構(gòu)


? ? 代碼實(shí)現(xiàn)

?? ?? ? 編寫工具類


?? ?? ? 編寫Servlet



(五)Cookie的分類


一、案例存在問題


問題描述:

? ? 用戶訪問Servlet,記錄用戶的上次訪問時間,但是如果用戶將瀏覽器關(guān)閉,再重新打開瀏覽器訪問程序,程序就會把其當(dāng)成是第一次訪問的用戶(顯示:您好,歡迎來到本網(wǎng)站)


二、Cookie的分類


1、默認(rèn)級別的Cookie

指的是沒有設(shè)置有效時間的Cookie,默認(rèn)的情況下,只要關(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)


三、代碼改進(jìn)

案例問題解決



(七)Cookie的使用細(xì)節(jié)


1、一個Cookie只能標(biāo)識一種信息,至少含有一個標(biāo)識該信息的名稱和值(即鍵值對)


2、一個web站點(diǎn)可以給一個瀏覽器發(fā)送多個Cookie,一個Web瀏覽器也可以存儲多個Web站點(diǎn)的Cookie


3、老版本瀏覽器一般只允許存放300個Cookie,每個站點(diǎn)最多可以存放20個Cookie,每個Cookie的大小限制為4KB,瀏覽器存放的Cookie的大小和個數(shù)是有限制的


4、如果創(chuàng)建了一個Cookie,并發(fā)送到瀏覽器,默認(rèn)情況下,它是一個會話級別的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、注意:一個瀏覽器獨(dú)占一個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的實(shí)現(xiàn)原理


一、Session的實(shí)現(xiàn)原理分析


服務(wù)器是如何實(shí)現(xiàn)一個Session為一個用戶瀏覽器服務(wù)的?


二、Session的實(shí)現(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ū)ο螅饔梅秶褪且淮螘挼姆秶?,一次會話,指的是用戶打開瀏覽器,點(diǎn)擊多個超鏈接,訪問服務(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過期,默認(rèn)的過期時間是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項(xiàng)目創(chuàng)建一個單獨(dú)的ServletContext對象

? ? 銷毀:服務(wù)器關(guān)閉的時候,或者項(xiàng)目人服務(wù)器中移除的時候


2、如何存取數(shù)據(jù)

? ? 存數(shù)據(jù)

?? ?? ? void setAttribute(String name, Object value);

? ? 取數(shù)據(jù)

?? ?? ? Object getAttribute(String name);


3、作用范圍

范圍是整個應(yīng)用的范圍


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Cookie & Session (一)會話技術(shù)的概述 一、什么是會話 會話可以簡單理解為,用戶打開一個瀏覽器...
    小湯源O閱讀 199評論 0 0
  • 背景在HTTP協(xié)議的定義中,采用了一種機(jī)制來記錄客戶端和服務(wù)器端交互的信息,這種機(jī)制被稱為cookie,cooki...
    時芥藍(lán)閱讀 2,462評論 1 17
  • 注:本文轉(zhuǎn)載自前端大全 背景 在HTTP協(xié)議的定義中,采用了一種機(jī)制來記錄客戶端和服務(wù)器端交互的信息,這種機(jī)制被稱...
    楠小忎閱讀 736評論 0 0
  • 1. cookie 1.1 什么是cookie cookie 是存儲于訪問者的計算機(jī)中的變量。每當(dāng)同一臺計算機(jī)通過...
    cbw100閱讀 4,193評論 0 13
  • 今天晚上,由于爸爸出去有事,媽媽還要開會,所以今天晚上只有我一個人在家里。 把作業(yè)做完了,我只能把我的課外書拿...
    zy呵呵呵閱讀 296評論 0 1

友情鏈接更多精彩內(nèi)容