第九章使用會(huì)話追蹤_第1頁(yè)
第九章使用會(huì)話追蹤_第2頁(yè)
第九章使用會(huì)話追蹤_第3頁(yè)
第九章使用會(huì)話追蹤_第4頁(yè)
第九章使用會(huì)話追蹤_第5頁(yè)
已閱讀5頁(yè),還剩31頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第九章使用會(huì)話追蹤

2011年5月30日

本節(jié)課的內(nèi)容:

⑥什么是客戶會(huì)話

⑥會(huì)話的工作機(jī)制

⑥維護(hù)會(huì)話的幾種方式

⑥跟蹤客戶會(huì)話

?,使用H11pSession對(duì)象維護(hù)會(huì)話信息

⑥監(jiān)視會(huì)話對(duì)象

2011年5月30日2

工、什么是會(huì)話

典型的在線商店的情況:

用戶剛剛在一個(gè)頁(yè)面中挑選到一種商品,添加到購(gòu)物車

中,在下一個(gè)商品頁(yè)面中又挑選到一種添加到購(gòu)物車中。

注意到這兩次選擇是在不同的HTTP連接中發(fā)生的。而用

戶希望兩次挑選的商品在同一個(gè)購(gòu)物車中一起交付,而不是

每選一件商品都要交付一次。這就需要一種機(jī)制來唯一的標(biāo)

識(shí)用戶,以便跟蹤客戶在站點(diǎn)中的行為。

會(huì)話:

這種在多次HTTP連接間維護(hù)用戶與同一用戶發(fā)出的不同

請(qǐng)求之間關(guān)聯(lián)的情況稱為維護(hù)一個(gè)會(huì)話(session)。

2011年5月30日3

2、會(huì)話的特征

合會(huì)話能夠把用戶與同一用戶發(fā)出的不同請(qǐng)求之間關(guān)聯(lián)

起來。不同用戶的會(huì)話應(yīng)當(dāng)是相互獨(dú)立的。

合會(huì)話一旦建立就應(yīng)當(dāng)一直存在,直到用戶空閑時(shí)間超

過了某一個(gè)時(shí)間界限,容器才應(yīng)當(dāng)釋放該會(huì)話資源。

⑥在會(huì)話的存活期間,用戶可能給服務(wù)器發(fā)送了很多請(qǐng)

求,該用戶的這些請(qǐng)求信息都可以存儲(chǔ)在會(huì)話中。

2011年5月30日4

3、會(huì)話的工作機(jī)制

網(wǎng)上購(gòu)物商店的購(gòu)物車

商店當(dāng)用戶選擇“YES”確認(rèn)購(gòu)買時(shí),服務(wù)

、器會(huì)將會(huì)話對(duì)象中的商品信息保存到

購(gòu)

用戶輸入個(gè)人信用信息登物數(shù)據(jù)庫(kù)中,并聯(lián)系網(wǎng)上銀行和郵局向

錄到網(wǎng)上商店用戶發(fā)貨。

用戶瀏覽產(chǎn)品頁(yè),察看商品

介紹,并點(diǎn)產(chǎn)“力口人”珀就在服務(wù)器,該商品的相關(guān)信息

商品信息在一次HTI保存在用戶的會(huì)話對(duì)象中

傳遞到服務(wù)器

f7<issword:

心h版川程序

q當(dāng)用戶離開網(wǎng)上商店前,被

詢問是否購(gòu)買。

2011年5月30日5

⑥在上述的網(wǎng)上商店中,用戶的會(huì)話信息保存在服務(wù)器端,用

戶與服務(wù)器之間必須提供一種機(jī)制,標(biāo)識(shí)某一用戶與他在服務(wù)

器端用戶狀態(tài)之間的對(duì)應(yīng)關(guān)系。這種機(jī)制必須保證:

■允許用戶在不同頁(yè)面(如:S一工vl一t)間瀏覽而不會(huì)丟失

“購(gòu)物車”

-必須避免不同用戶的“購(gòu)物車”混淆。用戶不會(huì)允許自

己為別的用戶付款。

今不幸的是通常情況下W一b服務(wù)器不會(huì)自動(dòng)跟蹤用戶操作軌跡。

捕獲并存儲(chǔ)用戶軌跡是W一b應(yīng)用開發(fā)人員的工作。

2011年5月30日6

4、維護(hù)會(huì)話的方式…?URL重寫

>客戶第一次訪問網(wǎng)站時(shí),將會(huì)話信息添加到由服務(wù)器發(fā)出

的每一個(gè)響應(yīng)的URL中。

爹當(dāng)用戶再次訪問網(wǎng)站時(shí),URL中會(huì)把這個(gè)會(huì)話信息作為用

戶請(qǐng)求參數(shù)返回服務(wù)器端,服務(wù)器根據(jù)返回的會(huì)話信息來標(biāo)

識(shí)該客戶,維護(hù)整個(gè)會(huì)話的信息持續(xù)性。

卷常見的URL重寫格式

為了保持URL的簡(jiǎn)潔,通常這個(gè)嵌在URL中的會(huì)話信息

是一個(gè)由服務(wù)器器成的代表客戶的唯一性的工D號(hào),在URL的

表現(xiàn)形式上,它通常是作為URL查詢參數(shù)的形式出現(xiàn)的,如:

http://.../ch09/huihua.jsp?sessionid=678

2011年5月30日7

#Session.jsp

#Tom.jsp

#■Jerry.jsp

2011年5月30日8

今URL重寫技術(shù)的優(yōu)點(diǎn):

■用戶是匿名的;

-在Web服務(wù)器實(shí)現(xiàn)上得到普遍的支持;

卷URL重寫技術(shù)的缺點(diǎn):

■由于會(huì)話信息作為查詢參數(shù)在URL上是可見的,因

此會(huì)話存在一定的安全隱患;

■需要對(duì)所有動(dòng)態(tài)生成的URL進(jìn)行重寫,代碼比較繁

瑣;

■只能用于動(dòng)態(tài)產(chǎn)生的文檔如Servlet和JSP頁(yè)面,而

不能用于HTML文檔;

■重寫的URL不能長(zhǎng)期有效

2011年5月30日9

5、隱藏窗體技術(shù)

⑥隱藏窗體技術(shù)原理

HTML表單允許把一些字段信息隱藏起來,而在瀏覽器上不

被顯示出來。例如:

<INPUTTYPE="H1DDEN"Name's一ssion"Value

⑥使用隱藏窗體技術(shù)實(shí)現(xiàn)會(huì)話管理

這種方式的工作機(jī)制為:在用戶第一次請(qǐng)求時(shí),服務(wù)器在

為客戶準(zhǔn)備的頁(yè)面上添加一個(gè)或多個(gè)隱藏表單,把一些要隱藏的

信息如標(biāo)識(shí)該客戶的工D號(hào)存儲(chǔ)在那里。當(dāng)客戶提交該表單時(shí),

這些信息會(huì)作為查詢參數(shù)返回服務(wù)器,服務(wù)器可以利坦、

HttpS一rvl一tR一qu一st對(duì)象的g一'tParam一t一r()方法讀取出來c

這樣就達(dá)到了在服務(wù)器端維護(hù)會(huì)話信息持續(xù)的作用。

2011年5月30日10

⑥可以這樣認(rèn)為,同重寫URL技術(shù)相比,

隱藏窗體技術(shù)在表單參數(shù)中傳遞會(huì)話信息,

而重寫URL技術(shù)是在GET參數(shù)中傳遞會(huì)話

信息。除了這點(diǎn),二者并無根本區(qū)別。

2011年5月30日11

卷上面我們分別說明了如何使用URL重寫、cooki一和

隱藏表單這三種方式來跟蹤用戶會(huì)話。不管采用何種方

式,都應(yīng)實(shí)現(xiàn)以下步驟:

1、服務(wù)器必須為每個(gè)會(huì)話產(chǎn)生一個(gè)唯一的工D號(hào)

2、在服務(wù)器和客戶瀏覽器之間傳遞這個(gè)工D號(hào)以維持會(huì)

3、服務(wù)器端根據(jù)工D號(hào)維護(hù)相關(guān)客戶的會(huì)話信息

2011年5月30日12

6、使用內(nèi)建的Session對(duì)象

#'Servlet2.3規(guī)范定義了^^HttpSession^

口,允許S一rvl一t容器針對(duì)每一個(gè)用戶建立一個(gè)

HTTP會(huì)話(即HttpS一ssion對(duì)象),每個(gè)HTTP會(huì)

話將會(huì)自動(dòng)派減予一個(gè)唯一的會(huì)話編號(hào)(session

ID),而無需程序員編程實(shí)現(xiàn)。

*HttpS一ssion對(duì)象提供了和S一rvl一tCont一xt對(duì)

象相似的一組會(huì)話屬性的方法,這樣就可以很容易

地在服務(wù)器端存放用戶會(huì)話狀態(tài)。

2011年5月30日13

2011年5月30日14

會(huì)話與請(qǐng)求的關(guān)系

會(huì)話和請(qǐng)求之間的關(guān)系

會(huì)話維護(hù)的就是同一用戶的一組請(qǐng)求序列之間的關(guān)聯(lián)性。

mJI.、士-4^-fr-t人、-r.>口?、,AlY在一定A的J關(guān)系。換言之,

這些請(qǐng)求屬于一個(gè)會(huì)話,因?yàn)樗鼈兪峭粋€(gè)用戶發(fā)茬金港號(hào)哈

往同一個(gè)服務(wù)器應(yīng)用程序(HeUoworld)的,即使冷浦沙/:義叱白田

它們是發(fā)往不同的Servlet的。當(dāng)用戶在Helloworld9判斷該請(qǐng)求所屬的

下不同的Servlet間瀏覽時(shí),服務(wù)器可以用會(huì)話對(duì)象,

跟蹤與用戶有關(guān)的狀態(tài)。r

http://www.MyW/HelloworLServlet

Id/Servlet2

這些請(qǐng)求屬于另一個(gè)會(huì)話,代表不同的用戶。

hI/Servlet3

這時(shí)請(qǐng)求可以與上面的請(qǐng)求同時(shí)發(fā)生而不會(huì)被

Servlet混淆。Servlet

/HeUoworld

Web應(yīng)用

http://www.MyW/Helloworld7Servlet2'

http://www.MyW/Helloworld/Servlet3

http://www.MyW/HelloworlA/Servletl

http://www.MyW/HelloworldAServlet4

2011年5月30日客戶端215

會(huì)話與請(qǐng)求的關(guān)系

獲取與請(qǐng)求關(guān)聯(lián)的會(huì)話對(duì)象

Ht■tpS一rvl一■tR一qu一st對(duì)象提供了g一tS一ssion方法,

通過這個(gè)方法,S一rvl一t就可以獲得與當(dāng)前請(qǐng)?zhí)╆P(guān)聯(lián)的會(huì)話對(duì)象的

引用。該方法為重載的方法,有兩個(gè)版本:

■publicHttpSessiongetSession();

案故與當(dāng)朝德求相去聯(lián)的含話,如果當(dāng)前請(qǐng)求還沒有一個(gè)相關(guān)聯(lián)

的會(huì)話,就創(chuàng)建一個(gè)并返回。

■publicHttpSessiongetSession(boolbCreate);

扳回與當(dāng)前請(qǐng)求相關(guān)聯(lián)的會(huì)t面寸象。如果沒有,且參數(shù)cr一at一的

值為tru一,貝。創(chuàng)建異地向一個(gè)新的會(huì)話。如果cr一at一的值為

false,且請(qǐng)求沒有相關(guān)聯(lián)的會(huì)話對(duì)象,將返回null。

可以利用這點(diǎn)判斷用戶最直為第一次邁問朝點(diǎn)二如果一、、、

g一tS一ssion(false)返回null,則表不用尸是第一次訪問站點(diǎn),

如果返回非null則表示用戶不是第一次訪問站點(diǎn)。

2011年5月30日16

會(huì)話與請(qǐng)求的關(guān)系

獲取與請(qǐng)求關(guān)聯(lián)的會(huì)話對(duì)彳總是返回一個(gè)會(huì)話。但是我們不知道該會(huì)

、-r*DiVLr-kt,JL/_、--LD-1—

獲得會(huì)話ID并保存到字符串中。該串將類似于:

.32FE24119D28C30866C9EF4BEA40EF4E

判斷會(huì)話是新建的還是舊的。

if(s.isNew()){

out.printin("<p>新的會(huì)話工D="+sid+”</p>");

}

else{

out.printin("<p>歡迎回

來,<br>User:”+sid+”</p>");

}

2011年5月30日17

會(huì)話與請(qǐng)求的關(guān)系

會(huì)話工D

?s一rvl一t容器在創(chuàng)建每一個(gè)新的HTTP會(huì)話對(duì)象時(shí),都會(huì)賦予一

個(gè)新的工D號(hào)。

⑥s一工vl一t容器保證它在W一b應(yīng)用范圍內(nèi)是唯一的。

⑥會(huì)話工D是實(shí)際包含在Http請(qǐng)求/響應(yīng)報(bào)文中的會(huì)話數(shù)據(jù)。

?這個(gè)工D號(hào)可以通過HttpS一ssion對(duì)象的g一t工d()獲得。例如:

HttpS一ssicms一ssion=raqu一st.g一tS一ssion();

Strings一ssion工d=s一ssion.g一t工d();

2011年5月30日18

會(huì)話與請(qǐng)求的關(guān)系

HttpS一ssion工作原理

1.當(dāng)用戶第一次發(fā)出請(qǐng)求時(shí),S一工vl一t容器會(huì)建立一個(gè)HttpSassion

對(duì)象,并自動(dòng)分配一■個(gè)W一b應(yīng)用范圍內(nèi)唯一的Sassion工D與之對(duì)應(yīng)。

這個(gè)Session工D也會(huì)隨著HTTP響應(yīng)內(nèi)容傳遞給用戶端瀏覽器。傳遞

的方式默認(rèn)情況下為cooki一,如果用戶端瀏覽器關(guān)閉了cookie功能,

就會(huì)使用URL重寫技術(shù)傳遞給用戶瀏覽器。

2.在用戶發(fā)出的后續(xù)請(qǐng)求中,請(qǐng)求信息中會(huì)包含S一工v一It容器傳遞給它

的SessionIDoS一rvl一t容器就會(huì)根據(jù)傳回的S一ssion工D將原來

建立的HttpS一ssion對(duì)象將請(qǐng)求與HttpS一工vl一tR一qu一st對(duì)象關(guān)聯(lián)

起來。所以,對(duì)于同一個(gè)用戶,調(diào)用g一tS一ssion()方法返[1]的將是

同一個(gè)HttpS一ssion對(duì)象。

2011年5月30日19

HttpSession對(duì)象的屬性

與ServletContexI^^象類似,我們可以給HttpSession

對(duì)象綁定屬性。

■S一工vl一tCont一xt對(duì)象的屬性的作用域是W一b應(yīng)用程序,

在這個(gè)應(yīng)用程序下的所有S一zl一t都共享這些屬性;

-綁定到HttpSessicm對(duì)象上的屬性只在一次會(huì)話周期內(nèi)有

效,且只有在屬于該會(huì)話的HttpR一quest對(duì)象中才可以訪

問這些屬性。換句話說,會(huì)話屬件就是特定用戶的專用數(shù)據(jù),

同時(shí)訪問W一b應(yīng)用的其他用戶無法訪問這些屬性。

2011年5月30日20

HttpSession接口方法一訪問屬性

HttpSession接口使用以下方法管理綁定到會(huì)話的屬

voids一tAttribut一(Stringnam一,Obj一ctvalue)

Objectg一tAttribut一(Stringnam一)

void工一mov一Att工ibute(Stringnam一)

?除伽的蹄頡叫楸槌u附麒的噬掘頻碘豳鼬蒯輜周一

的堪聊雎制朝哪?例僦葡皴崎儂蹴蜘說ne雇的可姒肥邰播

闔楂時(shí)族弼曲對(duì)袈蜃豳對(duì)魔殿甜象將由vlaue指定的對(duì)象置換掉。

HttpSessionsession=request.getSession(true);

幽鎮(zhèn)§幽)n(true);

Nttp^^km1s€S8senHrgqti^tti^tfte^hxii0iiMt)^);

session.setAttribute(naccountn,acct);

2011年5月38^sion.setAttribute(naccount6t,newInteger(lOO));21

HttpSession接口方法一訪問屬性

用false參數(shù)獲取現(xiàn)有會(huì)話對(duì)象。若沒有,則創(chuàng)建一

個(gè)新的會(huì)話,并將visitCount對(duì)象綁定到該會(huì)話名

publicvoiddoGet(HttpServletRe為“visitCount”的屬性。

HttpServletResponseresponse)注意綁定到會(huì)話屬性的對(duì)象類型只能為Object類型。

即可以是null、int、double、boolean以外的類型。

注意在本例中newInteger(visitCount))的用法

intvLsitCount;

HttpSessionsession=request.getSession(false);

if(session==null){若存在會(huì)話,則從該會(huì)話提取名為“visitCount”

vLsitCount=l;的綁定對(duì)象。更新其值后,重新綁定到會(huì)話。

session=request.getSessi

session.setAttribute("y,new

Integer(visitCount));

}else{

visitCount=((Integer)session.getAttribute("visitCount")).intVal

ue();

visitCount++;

session.setAttribute(HvisitCount",new

22

HttpSession接口方法一終止會(huì)話

如果要終止某個(gè)HTTP會(huì)話,可以使用下面的幾種方式

publicvoidinvalidat一()方法

publicvoids一tMax工nactiv一工nt一rval(intinterval)

方法

在web.xm1中配置會(huì)話的生存時(shí)間

般嗣逮因嗨徽也颯謝帥像㈱翔教I加峨璇的逾神飾6綁姥國(guó)性,

寮金函蒯n-gfl咖gakStaiSExesfitiiHt鼎1翁ut例期;素指定,單位為分鐘:

HttpSessionse^sion=request.getSession(true);

^猷惻0n(true);

T<sessiaii-tim£ouf>yO</session-timeouf>

sessionanvanaafeQ;

碣湍瓢跪纜躁金比,沿本W(wǎng)eb應(yīng)用程序的間隔超過了10分鐘,容器

初倒.賴含嫡鬼碰氤出劭底懶嫩赧1EI置的曬第璇坤食麻游

2011年5月3曲篦攜提責(zé)問閥陶超迤的弱會(huì)解§將肺擻會(huì)時(shí)之中。23

對(duì)于網(wǎng)上商店這樣的應(yīng)用,可能希望對(duì)“商店”中當(dāng)前

的客人總數(shù)進(jìn)行監(jiān)控。根據(jù)前面所學(xué)內(nèi)容,我們知道應(yīng)該利用會(huì)話

來實(shí)現(xiàn)該功能。

在本節(jié)中,我們將學(xué)習(xí)利用HttpS一ssionList一n一r偵

聽器,輕松實(shí)現(xiàn)一個(gè)計(jì)數(shù)器,以跟蹤并向用戶顯示本網(wǎng)站的在線人

數(shù)。

監(jiān)視會(huì)話對(duì)象

2011年5月30日24

鐐施陵慚對(duì)象

4加稻

會(huì)話偵聽器是用來監(jiān)聽會(huì)話事件的監(jiān)聽器類。同其他Web偵聽

監(jiān)器類似,會(huì)話偵聽器由用戶編寫并注冊(cè)到web應(yīng)用中。當(dāng)容器檢測(cè)

視到某個(gè)會(huì)話有事件發(fā)生時(shí),容器將激活監(jiān)聽器對(duì)象并激發(fā)對(duì)應(yīng)的事

件方法。

會(huì)主要有兩類會(huì)話偵聽器:

對(duì)⑥會(huì)話生命周期偵聽器

象同S一rv一tCont一xtList一n一r類似,這類偵聽器主要負(fù)責(zé)會(huì)話生

命周期事件的監(jiān)聽,如會(huì)話的生成、結(jié)束、激活等。在S一rv工一t規(guī)

范中,可以通過實(shí)現(xiàn)接口HttpSessionListener和

HttpSessionActivationListener來實(shí)現(xiàn)偵聽。

參會(huì)話屬性偵聽器、…

同S一rv一tCont一xtAt?tribut一List一n一r類似,這類偵聽器負(fù)責(zé)

處理綁定到會(huì)話的屬性的更改事件,如綁定、刪除、修改等。這類

偵聽器應(yīng)實(shí)現(xiàn)HttpSessionAttributeListener或

HttpSessionBindingListener接口。

2011年5月30日25

、會(huì)話生命周期事件

4加稻

會(huì)話的生命周期是由S一rvl一t容器管理的。在會(huì)話生

監(jiān)

年周容官合有今于當(dāng)去器方現(xiàn)某個(gè)杳話的次態(tài)發(fā)生變溫時(shí)(如生成、鼠

視我們需要做的是實(shí)現(xiàn)監(jiān)弓化、激活、銷毀),容器會(huì)將一個(gè)SessionEvent對(duì)象

會(huì)作為參數(shù)調(diào)用注冊(cè)的監(jiān)聽器。

HttpSessionEvent

對(duì)生成會(huì)話HttpSessionListener

可以添加:替換、

刪除型話精華HttpSessionActivationEvent

鈍化會(huì)話)-----------------------------1HttpSessionActivationListener

HttpSessionActivationEvent

激活會(huì)話HttpSessionActvationListener

可以添力、替換、

.除"話屬)

HttpSessionEvent

r銷毀會(huì)話)

HttpSessionListener

2011年5月一、---------->

HttpSessionListener偵聽器

4

OS

監(jiān)

視對(duì)于本節(jié)要完成的任務(wù),我們利用會(huì)話的生命周期事件來實(shí)現(xiàn)當(dāng)前

會(huì)在線人數(shù)的統(tǒng)計(jì)工作。

話當(dāng)一個(gè)用戶登錄網(wǎng)站時(shí),容器將創(chuàng)建一個(gè)會(huì)話,這時(shí)可以將在線人

對(duì)數(shù)計(jì)數(shù)器加1;當(dāng)田口超時(shí)、洋鐺時(shí)一裒瞿"為;玄仝在牛的一在線

當(dāng)容器生成一個(gè)新會(huì)話時(shí)會(huì)通知HttpSessionListener偵聽器

象人數(shù)計(jì)數(shù)器減

調(diào)用本方法。容器向該方法傳遞的參數(shù)是HttpSessionEvent

當(dāng)容器創(chuàng)建或

對(duì)當(dāng)某個(gè)會(huì)話超時(shí)或者調(diào)用了invalidate。方法都會(huì)引起會(huì)話的

偵聽器。Httj偵銷毀。在會(huì)話銷毀之前,容器會(huì)通知HttpSessionListener

在這兩個(gè)方法pi偵聽器并調(diào)用本方法。

同樣,容器向該方法傳遞的參數(shù)是HttpSessionEvent對(duì)象,

偵聽器可通過其getSessionO方法引用發(fā)生事件的會(huì)話對(duì)象。

publicvoids一一ssionEsee!

publicvoids一ssicmD一stroy一d(HttpS一ssimt

sc一)

2011年5月30日

HttpSessionListener偵聽器

4

OS

監(jiān)

視注意事項(xiàng):

會(huì)

話1.當(dāng)實(shí)現(xiàn)HttpSessionListener偵聽器時(shí),必須同附

對(duì)s一ssionCr一at一、s一ssionD一st工oy一d的實(shí)現(xiàn)。當(dāng)僅僅需要

象偵聽一個(gè)事件時(shí),另一個(gè)事件方法可用空方法體,但必須實(shí)現(xiàn);

2.通過從參數(shù)得到的HttpS一ssionEv一nt引用,在

s一ssionCr一at一方法和s一ssionD一stroy一d方法內(nèi)可以獲得

發(fā)生事件的會(huì)話的引用。除此之外,HttpSessionEvent

參數(shù)并不提供其他信息;

3.與S一rvl一tCont一xtList一n一r類似,這兩個(gè)方法可能會(huì)遇到

多線程同步問題。

2011年5月30日28

publicclassOnlineCounterListenerimplementsServletContextListener,HttpSessionListener{

publicvoidcontext工nitialized(S一rvl一tCont一xtEv一ntsee)

(

S一工vl一tContext

cont一xt=sc一.g一tS一rvl一tConTaxT;

工nt一garcountc當(dāng)容器每次進(jìn)入一個(gè)新的會(huì)話時(shí),從該會(huì)話檢索出所

context.s一tAt'屬的Web應(yīng)用上下文,然后將其"counter”屬性的值

}加1。注意"counter”屬性是一個(gè)整型的、在整個(gè)Web

入】.44nd應(yīng)用運(yùn)行期間維護(hù)的量。

publicvoidcontextDestroi一、=-一一一一一一一一

S一rvl一tCont一xt

conLexL=t>ce.geLServle);

context.r一mev一一r”);

當(dāng)容器每次刪除一個(gè)會(huì)話時(shí),說明有用戶正在離開當(dāng)

publicvoidsessionCreatec前Web應(yīng)用。從會(huì)話檢索出所屬Web應(yīng)用上下文,然

HttpSassions一ssion=s(后將其“counter”屬性的值減1,重新存入Web應(yīng)用上

下文。

S一rvl一tCont一xtcont一x-▼▼V<J/.LA/|J~|~/、p'11J,\JA411J''JJL_t

工nt一gar9S^rvletContext屬性,這樣就能保證計(jì)數(shù)器

counter=(Integer)context.對(duì)象能夠讓所有的用戶訪問。

count一r=n一wInteger(count一工.cntValu一()+1);

cont一xt.s一tAtt工ibut一("count一r”,counter);

publicvoidsessionDestroyed(HttpS一ssionEv一ntse){

HttpSassions一ssion=s一.g一tS一ssion();

S一工vl一tCont一xtcont一xt=sassion.g一tS一工vl一tCont一xt();

count一工=(工nt一ger)cont一xt.g一tAttribute("counter");

HttpSessionListener偵聽器

4om箱

°本例中的幾個(gè)問題說明:

監(jiān)i.四個(gè)方法的作用必須分清楚:、

contextInitial!zed負(fù)責(zé)在Web上下文中建立"counter”屬性并設(shè)置初值;

視sessionCreated負(fù)責(zé)在新會(huì)話出現(xiàn)時(shí)將“counter”屬性值增、加

sessionDestroyed負(fù)責(zé)在會(huì)話結(jié)束時(shí)將"counter”屬性值減少

會(huì)contextDestroyed負(fù)責(zé)在Web應(yīng)用結(jié)束前釋放上下文屬性所苫資源。

2.編寫好事件偵聽器后,還要注冊(cè)到Web.xml中才會(huì)生效。其中:

對(duì)〈session-config〉

<session-timeout>l</session-timeout>---

象會(huì)話失效時(shí)間長(zhǎng)度

</session-config>

<listener><listener-class>

com.mycompany.servlet.OnlineCounterListener事件類的

全名

〈/listener-class〉</listener>

3.在Web應(yīng)用中的某個(gè)Servlet中,可以隨時(shí)查詢計(jì)數(shù)

context=this.getServletContext();

request.getSession(true);//若還未進(jìn)入會(huì)i舌貝(J倉(cāng)U建—1^。

out.printin("<p>Online:n+context.getAttribute("counter")+

n</p>");

out.printin(</body></html>n);

2011年5月赳用《9$就$1。1111注01^「只能監(jiān)聽整個(gè)對(duì)象的生命周期,無法監(jiān)聽會(huì)話屬理M添加、

朋||K仝書才?4^萬1.U勺不用1支止匕d三自.才市由Hh■HnGaQQ-icn△十上rTHiihaT.iQhanar

二會(huì)話屬性偵聽器

4加稻

當(dāng)容器發(fā)現(xiàn)向某個(gè)會(huì)話的屬性發(fā)生變化時(shí),將向

、、.nrtBv1r-nJ」.▼一.*.?

監(jiān)

問偵聽費(fèi)是滿足以下條件的Java類:合對(duì)屬性的

添?實(shí)現(xiàn)HttpSessionAttributeListener或HttpSessionBindingListener接口

會(huì),注冊(cè)到了Web.XML卜的<listener><listener-class>節(jié)中

在偵聽器中的事件方法

話取發(fā)生事件的會(huì)話和屬事件發(fā)生時(shí),一個(gè)HttpSessionBindingEvent對(duì)

一般情況下,我們通過象作為消息參數(shù)發(fā)送到偵聽器。偵聽器可以:

對(duì)

器而不是HttpSessionBii通過該參數(shù)獲得會(huì)話、屬性名等信息。

象生成或被治;:巾

HttpSessionBindingEvent

添加屬性

HttpSessionBindingEvent

替換屬性)------------------------------■HttpSessionAttributeListener

一.“=>…\HttpSessionBindingEvent

刪除屬性1________________________I

2011年5月30E鈍化或隼毀會(huì)話

HttpSessionAttributeListener偵聽器

領(lǐng)

監(jiān)

HttpSessionAttributeListener4fe口共定義了三個(gè)方法:

話■publicvoid

attributeAdded(HttpSessionBindingEventse)

對(duì)

當(dāng)使用HttpSession對(duì)象的setAttribute()方法添力口——

象個(gè)新的會(huì)話屬性時(shí),容器會(huì)調(diào)用偵聽器的這個(gè)方法。

■publicvoid

attributeRemoved(HttpSessionBindingEventse)

當(dāng)通過HttpS一ssion對(duì)象的removeAttribute()方法刪

除一個(gè)會(huì)話屬性時(shí),容器會(huì)調(diào)用偵聽器的這個(gè)方法。

■publicvoid

2011年5月30日attributeReplaced(HttpSessionBindingEventse)

HnTTIIC11*4^:不___■1____/%F豐*.

HttpSessionAttributeListener偵聽器

4

OS

監(jiān)

視HttpSessionBindingEvent^象

會(huì)

對(duì)當(dāng)會(huì)話屬性發(fā)生變更時(shí),通知_

象HttpS一ssionAttribut一List一n一工偵聽器的事件為

HttpS一ssionBindingEv一nt對(duì)象。

HttpS一ssionBindingEv一nt類繼承自HttpS一ssionEv一nt類,

除了繼承的g一tS一ssion()方法,

HttpS一ssionBindingEv一nt類還定義了兩個(gè)方法:

■StringgetName()

返回綁定到會(huì)話對(duì)象或解除綁定的屬性的名稱。

■ObjectgetValue()

返回添加、替換或要?jiǎng)h除的會(huì)話屬性。

2011年5月30日33

publicclassSessionAttributeHandlerimplementsHttpSessionAttributeListener{

publicvoidattributeAdded(HttpSessionBinclingEventse){

HttpSessionsession=se.getSession();

ServletContextcontext=session.getServletContext();

context.log("Anattributenamed"+se.getName()+“!!

+s一.g一tValu一()+“add一d");

}

當(dāng)向會(huì)話中綁定新屬性時(shí),容器調(diào)用該方法。參數(shù)se

publicvoidattributeRemoved(1說明了發(fā)生事件的會(huì)話對(duì)象以及新添加的屬性。

HttpSessionsession=se.g(在本例中,我們從se獲取會(huì)話,然后獲取Web上下文

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論