一、會話概述
在日常生活中巨朦,從撥通電話到掛斷電話之間的一連串的你問我答的過程就是一個會話衙熔。
Web應(yīng)用中的會話過程類似與生活中的打電話過程,他指的是客戶端(瀏覽器)與服務(wù)器之間連續(xù)一系列請求和響應(yīng)的過程名段,例如:戶到某購物網(wǎng)站購買商品,這時用戶會和網(wǎng)站之間發(fā)生多次的請求響應(yīng)泣懊,整個購物的過程稱為會話.
在打電話的過程中伸辟,通信雙方會有通話內(nèi)容,同樣嗅定,在客戶端和服務(wù)端交互的過程中自娩,也會產(chǎn)生一些數(shù)據(jù)用踩。
例如,用戶甲和用戶乙分別登錄了購物網(wǎng)站渠退,甲購買了一個小米手機(jī),乙購買了一個iPad,當(dāng)這兩個用戶結(jié)賬時脐彩,Web服務(wù)器需要對用戶甲和用戶乙的信息分別保存碎乃。
在以前講的知識中,HttpServletRequest和ServletConext對象都可以對數(shù)據(jù)進(jìn)行保存惠奸,但是這兩個對象都不行梅誓,具體原因如下:
(1)客戶端請求web服務(wù)器時,針對每次的Http請求佛南,Web服務(wù)器都會創(chuàng)建一個HttpServletRequest對象梗掰,該對象只能保存本次請求所傳遞的數(shù)據(jù)。由于購買和結(jié)賬是兩個不同的請求嗅回,因此及穗,在發(fā)送結(jié)賬請求時,之前購買請求中的數(shù)據(jù)將會丟失绵载。
(2)使用ServletContext對象保存數(shù)據(jù)時埂陆,由于同一個web應(yīng)用(項目)共享同一個ServletContext對象苛白,因此,當(dāng)用戶進(jìn)行結(jié)賬請求時焚虱,由于無法區(qū)分哪個商品是哪個用戶購買的购裙,而是將該購物網(wǎng)站的所有用戶購買的商品進(jìn)行結(jié)算,這顯然是不行的鹃栽。
為了保存會話過程中產(chǎn)生的數(shù)據(jù)躏率,在servlet技術(shù)中,提供了兩個用于保存會話數(shù)據(jù)的對象分別是cookie和session民鼓。
二禾锤、Cookie介紹&Cookie案例
2.1.Cookie和Session技術(shù)概述
用戶打開瀏覽器開始訪問服務(wù)器,在一系列的訪問過程中摹察,把用戶的這些操作稱為用戶和服務(wù)器的之間的對話(客戶端和服務(wù)器的會話)恩掷。
在交互的過程中,用戶的一系列操作供嚎,肯定會產(chǎn)生一些數(shù)據(jù)需要保存黄娘。這時就需要使用Java提供的Cookie或者Session技術(shù)來完成。
cookie的典型應(yīng)用是:
判斷用戶是否登陸過網(wǎng)站克滴,以便下次登錄時能夠直接登錄逼争。如果我們刪除cookie,則每次登錄必須從新填寫登錄的相關(guān)信息劝赔。
Cookie技術(shù)在實際網(wǎng)站中的工作原理:
Cookie:它是服務(wù)器在獲取到用戶的請求之后誓焦,把用戶的請求中的重要資源保存在這個對象中,在給用戶響應(yīng)的時候着帽,把這個對象的發(fā)給客戶端杂伟。然后瀏覽器接收到這個Cookie之后,瀏覽器會自動的把Cookie中的數(shù)據(jù)保存到瀏覽器管理的緩存中仍翰,下次用戶在訪問這個網(wǎng)站的時候赫粥,瀏覽器就會自動攜帶上次保存的Cookie中的數(shù)據(jù)到服務(wù)器,服務(wù)器進(jìn)而就能獲取到以前的信息予借。
2.2.Cookie的API介紹
2.2.1.創(chuàng)建Cookie
創(chuàng)建一個 cookie越平,cookie 是 servlet 發(fā)送到 Web 瀏覽器的少量信息,這些信息由瀏覽器保存灵迫,然后發(fā)送回服務(wù)器秦叛。cookie 的值可以唯一地標(biāo)識客戶端,因此 cookie 常用于會話管理瀑粥。
一個 cookie 擁有一個名稱挣跋、一個值和一些可選屬性,比如注釋利凑、路徑和域限定符浆劲、最大生存時間和版本號嫌术。一些 Web 瀏覽器在處理可選屬性方面存在 bug,因此有節(jié)制地使用這些屬性可提高 servlet 的互操作性牌借。
servlet 通過使用HttpServletResponse#addCookie方法將 cookie 發(fā)送到瀏覽器度气,該方法將字段添加到 HTTP 響應(yīng)頭。
通過Cookie的構(gòu)造函數(shù)膨报,告訴我們在服務(wù)器給響應(yīng)數(shù)據(jù)的時候磷籍,如果要發(fā)送一個Cookie對象,這時需要在服務(wù)器先創(chuàng)建一個Cookie對象现柠,而這個Cookie中保存的數(shù)據(jù)由key和value組成院领。
當(dāng)瀏覽器下次再訪問服務(wù)器的時候,就會攜帶這個Cookie對象到服務(wù)器够吩,服務(wù)器就會獲取到當(dāng)前這個Cookie對象比然,然后需要通過這個key,找出value值周循。
需要把瀏覽器cookie發(fā)送給瀏覽器强法,需要借助response對象完成
response.addCookie(Cookie對象);
初次訪問(debug追蹤):
在響應(yīng)中有cookie,在請求頭中沒有cookie的信息
第二次訪問:
2.2.2.獲取Cookie
在客戶端訪問servlet的時候湾笛,首先在servlet中先判斷當(dāng)前用戶有沒有攜帶cookie數(shù)據(jù)
如果有饮怯,我們就可以獲取這個cookie數(shù)據(jù);
如果沒有嚎研,我們就在程序中創(chuàng)建一個cookie給用戶寫到客戶端蓖墅。
下次用戶訪問的時候一定會攜帶Cookie到服務(wù)器。
獲取請求中的cookie需要使用request對象临扮。
request對象中的getCookies獲取到一個cookie數(shù)組论矾,因此一個Servlet可以同時發(fā)送給客戶端多個Cookie對象。
首次瀏覽器訪問:
第二次訪問:
2.2.3.Cookie分類
1公条、
臨時會話級別的Cookie
服務(wù)器給客戶端發(fā)送的Cookie拇囊,如果沒有指定Cookie在客戶端的保存時間,這時這個Cookie只會在瀏覽器運(yùn)行的期間存在靶橱;
當(dāng)瀏覽器關(guān)閉之后,客戶端中的Cookie隨著瀏覽器的關(guān)閉就消失了路捧。
2关霸、持久化的Cookie
在服務(wù)器給客戶端發(fā)送Cookie的時候,可以指定Cookie在客戶端的存活時間杰扫。
注意:這里的時間值不要太大
2.2.4.設(shè)置路徑(難點)
問題1:訪問服務(wù)器的每一個路徑都攜帶cookie數(shù)據(jù)這樣合理嗎队寇?
問題2:cookie的默認(rèn)路徑是什么? 有什么根據(jù)章姓?
如果創(chuàng)建某個cookie屬性沒有設(shè)置path屬性佳遣,那么該cookie只對當(dāng)前訪問路徑所屬的目錄及其子目錄有效识埋。
假設(shè):訪問/day11/cookie1,他的目錄是/day11,子目錄是/day11/xxx/yyy....,均有效 會攜帶cookie
假設(shè):訪問/day11/aaa/bbb/ccc/cookie1,他的目錄是/day11/aaa/bbb/ccc,子目錄是:/day11/aaa/bbb/ccc/xxx/yyy/....,均會攜帶cookie
如果想讓某個cookie項對站點的所有訪問路徑都有效,就調(diào)用:cookie.setPath("/")/表示http://ip:端口
2.2.5.Cookie的有效域名(了解)
設(shè)置當(dāng)前這個Cookie在哪個域名下有效零渐。一般的瀏覽器都不支持接受不是當(dāng)前域名下的Cookie窒舟。
如果把cookie的域名設(shè)置成其他的域名,而不是當(dāng)前這個資源的域名诵盼,
這個cookie被稱為第三方Cookie惠豺,幾乎所有的瀏覽器默認(rèn)不支持第三方Cookie。
注意:不要設(shè)置他
2.2.6.刪除Cookie
1风宁、將cookie的name(key)保持一致洁墙,value設(shè)置為"";
cookie = new Cookie("username","")
2、設(shè)置存活時間為0戒财,
cookie.setMaxAge(0)
3热监、路徑要發(fā)送cookie時保持一致。
cookie.setPath("/");
4饮寞、將cookie發(fā)送給瀏覽器狼纬。
response.addCookie(cookie)
2.3.cookie案例:顯示用戶上次訪問的時間
當(dāng)用戶訪問某些web應(yīng)用的時候,經(jīng)常會顯示出上次的訪問時間骂际。
例如:QQ登錄成功后疗琉,會顯示用戶上次的登錄時間。
1歉铝、向瀏覽器發(fā)送cookie
2盈简、從cookie中獲取上次訪問的時間
3根據(jù)上次訪問時間的內(nèi)容,給瀏覽器顯示對應(yīng)的內(nèi)容
首次訪問對應(yīng)的servlet
第N(>1)次訪問:
整體代碼: