版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、2020年9月2日,1,第九章 使用會(huì)話(huà)追蹤,2020年9月2日,2,本節(jié)課的內(nèi)容: 什么是客戶(hù)會(huì)話(huà) 會(huì)話(huà)的工作機(jī)制 維護(hù)會(huì)話(huà)的幾種方式 跟蹤客戶(hù)會(huì)話(huà) 使用HttpSession對(duì)象維護(hù)會(huì)話(huà)信息 監(jiān)視會(huì)話(huà)對(duì)象,2020年9月2日,3,典型的在線(xiàn)商店的情況: 用戶(hù)剛剛在一個(gè)頁(yè)面中挑選到一種商品,添加到購(gòu)物車(chē)中,在下一個(gè)商品頁(yè)面中又挑選到一種添加到購(gòu)物車(chē)中。 注意到這兩次選擇是在不同的HTTP連接中發(fā)生的。而用戶(hù)希望兩次挑選的商品在同一個(gè)購(gòu)物車(chē)中一起交付,而不是每選一件商品都要交付一次。這就需要一種機(jī)制來(lái)唯一的標(biāo)識(shí)用戶(hù),以便跟蹤客戶(hù)在站點(diǎn)中的行為。 會(huì)話(huà): 這種在多次HTTP連接間維護(hù)用戶(hù)與同一用
2、戶(hù)發(fā)出的不同請(qǐng)求之間關(guān)聯(lián)的情況稱(chēng)為維護(hù)一個(gè)會(huì)話(huà)(session)。,1、什么是會(huì)話(huà),2020年9月2日,4,2、會(huì)話(huà)的特征 會(huì)話(huà)能夠把用戶(hù)與同一用戶(hù)發(fā)出的不同請(qǐng)求之間關(guān)聯(lián)起來(lái)。不同用戶(hù)的會(huì)話(huà)應(yīng)當(dāng)是相互獨(dú)立的。 會(huì)話(huà)一旦建立就應(yīng)當(dāng)一直存在,直到用戶(hù)空閑時(shí)間超過(guò)了某一個(gè)時(shí)間界限,容器才應(yīng)當(dāng)釋放該會(huì)話(huà)資源。 在會(huì)話(huà)的存活期間,用戶(hù)可能給服務(wù)器發(fā)送了很多請(qǐng)求,該用戶(hù)的這些請(qǐng)求信息都可以存儲(chǔ)在會(huì)話(huà)中。,2020年9月2日,5,網(wǎng)上購(gòu)物商店的購(gòu)物車(chē),3、會(huì)話(huà)的工作機(jī)制,用戶(hù)輸入個(gè)人信用信息登錄到網(wǎng)上商店,商店為用戶(hù)創(chuàng)建一個(gè)獨(dú)一無(wú)二的、用戶(hù)獨(dú)有的會(huì)話(huà)對(duì)象-購(gòu)物車(chē),用戶(hù)瀏覽產(chǎn)品頁(yè),察看商品介紹,并點(diǎn)擊“加入”
3、按鈕。,商品信息在一次HTTP連接中傳遞到服務(wù)器,在服務(wù)器,該商品的相關(guān)信息保存在用戶(hù)的會(huì)話(huà)對(duì)象中,當(dāng)用戶(hù)離開(kāi)網(wǎng)上商店前,被詢(xún)問(wèn)是否購(gòu)買(mǎi)。,當(dāng)用戶(hù)選擇“YES”確認(rèn)購(gòu)買(mǎi)時(shí),服務(wù)器會(huì)將會(huì)話(huà)對(duì)象中的商品信息保存到數(shù)據(jù)庫(kù)中,并聯(lián)系網(wǎng)上銀行和郵局向用戶(hù)發(fā)貨。,2020年9月2日,6,在上述的網(wǎng)上商店中,用戶(hù)的會(huì)話(huà)信息保存在服務(wù)器端,用戶(hù)與服務(wù)器之間必須提供一種機(jī)制,標(biāo)識(shí)某一用戶(hù)與他在服務(wù)器端用戶(hù)狀態(tài)之間的對(duì)應(yīng)關(guān)系。這種機(jī)制必須保證: 允許用戶(hù)在不同頁(yè)面(如:Servlet)間瀏覽而不會(huì)丟失“購(gòu)物車(chē)” 必須避免不同用戶(hù)的“購(gòu)物車(chē)”混淆。用戶(hù)不會(huì)允許自己為別的用戶(hù)付款。 不幸的是通常情況下Web服務(wù)器不會(huì)
4、自動(dòng)跟蹤用戶(hù)操作軌跡。捕獲并存儲(chǔ)用戶(hù)軌跡是Web應(yīng)用開(kāi)發(fā)人員的工作。,2020年9月2日,7,客戶(hù)第一次訪(fǎng)問(wèn)網(wǎng)站時(shí),將會(huì)話(huà)信息添加到由服務(wù)器發(fā)出的每一個(gè)響應(yīng)的URL中。 當(dāng)用戶(hù)再次訪(fǎng)問(wèn)網(wǎng)站時(shí),URL中會(huì)把這個(gè)會(huì)話(huà)信息作為用戶(hù)請(qǐng)求參數(shù)返回服務(wù)器端,服務(wù)器根據(jù)返回的會(huì)話(huà)信息來(lái)標(biāo)識(shí)該客戶(hù),維護(hù)整個(gè)會(huì)話(huà)的信息持續(xù)性。 常見(jiàn)的URL重寫(xiě)格式 為了保持URL的簡(jiǎn)潔,通常這個(gè)嵌在URL中的會(huì)話(huà)信息是一個(gè)由服務(wù)器生成的代表客戶(hù)的唯一性的ID號(hào),在URL的表現(xiàn)形式上,它通常是作為URL查詢(xún)參數(shù)的形式出現(xiàn)的,如: http:/./ch09/huihua.jsp?sessionid=678,4、維護(hù)會(huì)話(huà)的方式-UR
5、L重寫(xiě),2020年9月2日,8,Session.jsp Tom.jsp Jerry.jsp,2020年9月2日,9,URL重寫(xiě)技術(shù)的優(yōu)點(diǎn): 用戶(hù)是匿名的; 在Web服務(wù)器實(shí)現(xiàn)上得到普遍的支持; URL重寫(xiě)技術(shù)的缺點(diǎn): 由于會(huì)話(huà)信息作為查詢(xún)參數(shù)在URL上是可見(jiàn)的,因此會(huì)話(huà)存在一定的安全隱患; 需要對(duì)所有動(dòng)態(tài)生成的URL進(jìn)行重寫(xiě),代碼比較繁瑣; 只能用于動(dòng)態(tài)產(chǎn)生的文檔如Servlet和JSP頁(yè)面,而不能用于HTML文檔; 重寫(xiě)的URL不能長(zhǎng)期有效,2020年9月2日,10,隱藏窗體技術(shù)原理 HTML表單允許把一些字段信息隱藏起來(lái),而在瀏覽器上不被顯示出來(lái)。例如: 使用隱藏窗體技術(shù)實(shí)現(xiàn)會(huì)話(huà)管理 這種
6、方式的工作機(jī)制為:在用戶(hù)第一次請(qǐng)求時(shí),服務(wù)器在為客戶(hù)準(zhǔn)備的頁(yè)面上添加一個(gè)或多個(gè)隱藏表單,把一些要隱藏的信息如標(biāo)識(shí)該客戶(hù)的ID號(hào)存儲(chǔ)在那里。當(dāng)客戶(hù)提交該表單時(shí),這些信息會(huì)作為查詢(xún)參數(shù)返回服務(wù)器,服務(wù)器可以利用HttpServletRequest對(duì)象的getParameter()方法讀取出來(lái)。這樣就達(dá)到了在服務(wù)器端維護(hù)會(huì)話(huà)信息持續(xù)的作用。,5、隱藏窗體技術(shù),2020年9月2日,11,可以這樣認(rèn)為,同重寫(xiě)URL技術(shù)相比,隱藏窗體技術(shù)在表單參數(shù)中傳遞會(huì)話(huà)信息,而重寫(xiě)URL技術(shù)是在GET參數(shù)中傳遞會(huì)話(huà)信息。除了這點(diǎn),二者并無(wú)根本區(qū)別。,2020年9月2日,12,上面我們分別說(shuō)明了如何使用URL重寫(xiě)、co
7、okie和隱藏表單這三種方式來(lái)跟蹤用戶(hù)會(huì)話(huà)。不管采用何種方式,都應(yīng)實(shí)現(xiàn)以下步驟: 1、服務(wù)器必須為每個(gè)會(huì)話(huà)產(chǎn)生一個(gè)唯一的ID號(hào) 2、在服務(wù)器和客戶(hù)瀏覽器之間傳遞這個(gè)ID號(hào)以維持會(huì)話(huà) 3、服務(wù)器端根據(jù)ID號(hào)維護(hù)相關(guān)客戶(hù)的會(huì)話(huà)信息,2020年9月2日,13,Servlet2.3規(guī)范定義了一個(gè)HttpSession接口,允許Servlet容器針對(duì)每一個(gè)用戶(hù)建立一個(gè)HTTP會(huì)話(huà)(即HttpSession對(duì)象),每個(gè)HTTP會(huì)話(huà)將會(huì)自動(dòng)被賦予一個(gè)唯一的會(huì)話(huà)編號(hào)(session ID),而無(wú)需程序員編程實(shí)現(xiàn)。 HttpSession對(duì)象提供了和ServletContext對(duì)象相似的一組會(huì)話(huà)屬性的方法,這樣
8、就可以很容易地在服務(wù)器端存放用戶(hù)會(huì)話(huà)狀態(tài)。,6、使用內(nèi)建的Session對(duì)象,2020年9月2日,14,HttpServletRequest對(duì)象提供了getSession方法,通過(guò)這個(gè)方法,Servlet就可以獲得與當(dāng)前請(qǐng)求關(guān)聯(lián)的會(huì)話(huà)對(duì)象的引用。該方法為重載的方法,有兩個(gè)版本: public HttpSession getSession();返回與當(dāng)前請(qǐng)求相關(guān)聯(lián)的會(huì)話(huà),如果當(dāng)前請(qǐng)求還沒(méi)有一個(gè)相關(guān)聯(lián)的會(huì)話(huà),就創(chuàng)建一個(gè)并返回。 public HttpSession getSession(bool bCreate);返回與當(dāng)前請(qǐng)求相關(guān)聯(lián)的會(huì)話(huà)對(duì)象。如果沒(méi)有,且參數(shù)create的值為true,則創(chuàng)建并
9、返回一個(gè)新的會(huì)話(huà)。如果create的值為false,且請(qǐng)求沒(méi)有相關(guān)聯(lián)的會(huì)話(huà)對(duì)象,將返回null??梢岳眠@點(diǎn)判斷用戶(hù)是否為第一次訪(fǎng)問(wèn)站點(diǎn):如果getSession(false)返回null,則表示用戶(hù)是第一次訪(fǎng)問(wèn)站點(diǎn),如果返回非null則表示用戶(hù)不是第一次訪(fǎng)問(wèn)站點(diǎn)。,7、會(huì)話(huà)與請(qǐng)求的關(guān)系,2020年9月2日,15,獲取與請(qǐng)求關(guān)聯(lián)的會(huì)話(huà)對(duì)象 HttpSession s = request.getSession(); String sid = s.getId(); if(s.isNew() out.println(新的會(huì)話(huà)ID=+sid+); else out.println(歡迎回來(lái),User:
10、+sid+); ,會(huì)話(huà)與請(qǐng)求的關(guān)系,總是返回一個(gè)會(huì)話(huà)。但是我們不知道該會(huì)話(huà)是新建的還是已有的。,獲得會(huì)話(huà)ID并保存到字符串中。該串將類(lèi)似于:32FE24119D28C30866C9EF4BEA40EF4E,判斷會(huì)話(huà)是新建的還是舊的。,2020年9月2日,16,會(huì)話(huà)ID servlet容器在創(chuàng)建每一個(gè)新的HTTP會(huì)話(huà)對(duì)象時(shí),都會(huì)賦予一個(gè)新的ID號(hào)。 servlet容器保證它在Web應(yīng)用范圍內(nèi)是唯一的。 會(huì)話(huà)ID是實(shí)際包含在Http請(qǐng)求/響應(yīng)報(bào)文中的會(huì)話(huà)數(shù)據(jù)。 這個(gè)ID號(hào)可以通過(guò)HttpSession對(duì)象的getId()獲得。例如: HttpSession session=request.getS
11、ession(); String sessionId=session.getId();,2020年9月2日,17,HttpSession工作原理 當(dāng)用戶(hù)第一次發(fā)出請(qǐng)求時(shí),Servlet容器會(huì)建立一個(gè)HttpSession對(duì)象,并自動(dòng)分配一個(gè)Web應(yīng)用范圍內(nèi)唯一的Session ID與之對(duì)應(yīng)。這個(gè)Session ID也會(huì)隨著HTTP響應(yīng)內(nèi)容傳遞給用戶(hù)端瀏覽器。傳遞的方式默認(rèn)情況下為cookie,如果用戶(hù)端瀏覽器關(guān)閉了cookie功能,就會(huì)使用URL重寫(xiě)技術(shù)傳遞給用戶(hù)瀏覽器。 在用戶(hù)發(fā)出的后續(xù)請(qǐng)求中,請(qǐng)求信息中會(huì)包含Servelt容器傳遞給它的Session ID。Servlet容器就會(huì)根據(jù)傳回的
12、Session ID將原來(lái)建立的HttpSession對(duì)象將請(qǐng)求與HttpServletRequest對(duì)象關(guān)聯(lián)起來(lái)。所以,對(duì)于同一個(gè)用戶(hù),調(diào)用getSession()方法返回的將是同一個(gè)HttpSession對(duì)象。,會(huì)話(huà)與請(qǐng)求的關(guān)系,2020年9月2日,18,與ServletContext對(duì)象類(lèi)似,我們可以給HttpSession對(duì)象綁定屬性。 ServletContext對(duì)象的屬性的作用域是Web應(yīng)用程序,在這個(gè)應(yīng)用程序下的所有Servlet都共享這些屬性; 綁定到HttpSession對(duì)象上的屬性只在一次會(huì)話(huà)周期內(nèi)有效,且只有在屬于該會(huì)話(huà)的HttpRequest對(duì)象中才可以訪(fǎng)問(wèn)這些屬性。換
13、句話(huà)說(shuō),會(huì)話(huà)屬性就是特定用戶(hù)的專(zhuān)用數(shù)據(jù),同時(shí)訪(fǎng)問(wèn)Web應(yīng)用的其他用戶(hù)無(wú)法訪(fǎng)問(wèn)這些屬性。,HttpSession對(duì)象的屬性,2020年9月2日,19,返回由name指定的會(huì)話(huà)屬性,如果name指定的屬性不存在將返回null。例如:在同一用戶(hù)的會(huì)話(huà)有效期內(nèi)的其他地方,我們可以把綁定到HttpSession對(duì)象上的對(duì)象取出來(lái): HttpSession session=request.getSession(true); Account acct=session.getAttribute(account);,刪除由name指定的HttpSession對(duì)象的會(huì)話(huà)屬性,如果由name指定的屬性不存在,方法將
14、直接返回。例如: HttpSession session=request.getSession(true); session.removeAttribute(account);,HttpSession接口使用以下方法管理綁定到會(huì)話(huà)的屬性 void setAttribute(String name,Object value) Object getAttribute(String name) void removeAttribute(String name),HttpSession接口方法訪(fǎng)問(wèn)屬性,將一個(gè)對(duì)象綁定到HttpSession對(duì)象,使之成為HttpSession對(duì)象的一個(gè)會(huì)話(huà)屬性。調(diào)用時(shí)
15、由value指定的對(duì)象將變成其name屬性。如果name屬性已經(jīng)存在,它原來(lái)對(duì)應(yīng)的對(duì)象將由vlaue指定的對(duì)象置換掉。 Account acct=new Account(); HttpSession session=request.getSession(true); session.setAttribute(account,acct); session.setAttribute(account“,new Integer(100);,2020年9月2日,20,如果要終止某個(gè)HTTP會(huì)話(huà),可以使用下面的幾種方式 public void invalidate()方法 public void setM
16、axInactiveInterval(int interval) 方法 在web.xml中配置會(huì)話(huà)的生存時(shí)間,HttpSession接口方法終止會(huì)話(huà),調(diào)用該方法將終止某個(gè)HTTP會(huì)話(huà)。之后如果嘗試向這個(gè)會(huì)話(huà)綁定屬性,將會(huì)得到一個(gè)IllegalStateException異常,例如: HttpSession session=request.getSession(true); session.invalidate(); Account acct=new Account(); session.setAttribute(account,acct); /本句拋出IllegalStateException,設(shè)置HTTP會(huì)話(huà)的超時(shí)時(shí)間,單位為秒。例如: HttpSession session=request.getSession(true); sess
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度虛擬現(xiàn)實(shí)產(chǎn)業(yè)投資民間擔(dān)保借款合同4篇
- 美團(tuán)騎手2025年度服務(wù)規(guī)范與績(jī)效考核合同3篇
- 二零二五年度寧波服務(wù)業(yè)勞動(dòng)合同示范文本4篇
- 2025個(gè)人獨(dú)資企業(yè)股權(quán)轉(zhuǎn)讓及企業(yè)運(yùn)營(yíng)支持合同2篇
- 2025年度個(gè)人對(duì)個(gè)人租車(chē)合同電子支付范本
- 二零二五年度不銹鋼護(hù)欄加工與運(yùn)輸一體化服務(wù)合同3篇
- 2025年度個(gè)人與個(gè)人間藝術(shù)品修復(fù)服務(wù)合同4篇
- 2025內(nèi)衣店加盟品牌授權(quán)及區(qū)域管理服務(wù)合同范本
- 二零二五年度大型公共建筑幕墻施工專(zhuān)項(xiàng)合同4篇
- 二零二五年度旅游演藝接待服務(wù)合同范本2篇
- 小王子-英文原版
- 給排水科學(xué)與工程基礎(chǔ)知識(shí)單選題100道及答案解析
- 新版中國(guó)食物成分表
- 2024年山東省青島市中考生物試題(含答案)
- 河道綜合治理工程技術(shù)投標(biāo)文件
- 專(zhuān)題24 短文填空 選詞填空 2024年中考英語(yǔ)真題分類(lèi)匯編
- 再生障礙性貧血課件
- 產(chǎn)后抑郁癥的護(hù)理查房
- 2024年江蘇護(hù)理職業(yè)學(xué)院高職單招(英語(yǔ)/數(shù)學(xué)/語(yǔ)文)筆試歷年參考題庫(kù)含答案解析
- 電能質(zhì)量與安全課件
- 工程項(xiàng)目設(shè)計(jì)工作管理方案及設(shè)計(jì)優(yōu)化措施
評(píng)論
0/150
提交評(píng)論