會(huì)話及會(huì)話技術(shù) 課件_第1頁(yè)
會(huì)話及會(huì)話技術(shù) 課件_第2頁(yè)
會(huì)話及會(huì)話技術(shù) 課件_第3頁(yè)
會(huì)話及會(huì)話技術(shù) 課件_第4頁(yè)
會(huì)話及會(huì)話技術(shù) 課件_第5頁(yè)
已閱讀5頁(yè),還剩66頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第5章會(huì)話及會(huì)話技術(shù)《Java

Web程序設(shè)計(jì)任務(wù)教程(第2版)》學(xué)習(xí)目標(biāo)/Target了解什么是Cookie掌握Cookie對(duì)象的使用

了解什么是Session

掌握Session對(duì)象的使用章節(jié)概述/Summary

當(dāng)用戶通過(guò)瀏覽器訪問(wèn)Web應(yīng)用時(shí),通常情況下,服務(wù)器需要對(duì)用戶的狀態(tài)進(jìn)行跟蹤。例如,用戶在網(wǎng)站結(jié)算商品時(shí),Web服務(wù)器必須根據(jù)請(qǐng)求用戶的身份,找到該用戶所購(gòu)買的商品。在Web開發(fā)中,服務(wù)器跟蹤用戶信息的技術(shù)稱為會(huì)話技術(shù),本章將針對(duì)會(huì)話及會(huì)話技術(shù)進(jìn)行詳細(xì)講解。目錄/Contents010203會(huì)話概述Cookie對(duì)象Session對(duì)象會(huì)話概述5.15.1會(huì)話概述先定一個(gè)小目標(biāo)!

先定一個(gè)小目標(biāo)!了解會(huì)話的概念,能夠知道會(huì)話用于做什么5.1會(huì)話概述在日常生活中,從撥通電話到掛斷電話之間的一連串的你問(wèn)我答的過(guò)程就是一個(gè)會(huì)話。在打電話過(guò)程中,通話雙方會(huì)有通話內(nèi)容,同樣,在客戶端與服務(wù)器交互的過(guò)程中,也會(huì)產(chǎn)生一些數(shù)據(jù)。例如,用戶甲和乙分別登錄了購(gòu)物網(wǎng)站,甲購(gòu)買了一個(gè)iPhone手機(jī),乙購(gòu)買了一個(gè)iPad,當(dāng)這兩個(gè)用戶結(jié)賬時(shí),Web服務(wù)器需要對(duì)用戶甲和乙的信息分別進(jìn)行保存。為了保存會(huì)話過(guò)程中產(chǎn)生的數(shù)據(jù),Servlet提供了兩個(gè)用于保存會(huì)話數(shù)據(jù)的對(duì)象,分別是Cookie和Session。會(huì)話的概念Cookie對(duì)象5.25.2.1什么是Cookie先定一個(gè)小目標(biāo)!

先定一個(gè)小目標(biāo)!了解什么是Cookie在現(xiàn)實(shí)生活中,當(dāng)顧客在購(gòu)物時(shí),商城經(jīng)常會(huì)贈(zèng)送顧客一張會(huì)員卡,卡上記錄用戶的個(gè)人信息(姓名,手機(jī)號(hào)等)、消費(fèi)額度和積分額度等。顧客一旦接受了會(huì)員卡,以后每次光臨該商場(chǎng)時(shí),都可以使用這張會(huì)員卡,商場(chǎng)也將根據(jù)會(huì)員卡上的消費(fèi)記錄計(jì)算會(huì)員的優(yōu)惠額度和累加積分。在Web應(yīng)用中,Cookie的功能類似于會(huì)員卡,當(dāng)用戶通過(guò)瀏覽器訪問(wèn)Web服務(wù)器時(shí),服務(wù)器會(huì)給客戶端發(fā)送一些信息,如用戶信息和商品信息,這些信息都保存在Cookie中。這樣,當(dāng)該瀏覽器再次訪問(wèn)服務(wù)器時(shí),會(huì)在請(qǐng)求頭中將Cookie發(fā)送給服務(wù)器,方便服務(wù)器對(duì)瀏覽器做出正確地響應(yīng)。Cookie的概念5.2.1什么是Cookie服務(wù)器向客戶端發(fā)送Cookie時(shí),會(huì)在HTTP響應(yīng)頭字段中增加Set-Cookie響應(yīng)頭字段。Set-Cookie頭字段中設(shè)置的Cookie的具體示例如下:Cookie的概念5.2.1什么是CookieSet-Cookie:user=itcast;Path=/;user表示Cookie的名稱,itcast表示Cookie的值,Path表示Cookie的屬性。Cookie必須以鍵值對(duì)的形式存在,Cookie屬性可以有多個(gè),屬性之間用分號(hào)“;”和空格分隔。當(dāng)用戶第一次訪問(wèn)服務(wù)器時(shí),服務(wù)器會(huì)在響應(yīng)消息中增加Set-Cookie頭字段,將用戶信息以Cookie的形式發(fā)送給瀏覽器。一旦用戶瀏覽器接受了服務(wù)器發(fā)送的Cookie信息,就會(huì)將它保存在瀏覽器的緩沖區(qū)中,這樣,當(dāng)瀏覽器后續(xù)訪問(wèn)該服務(wù)器時(shí),都會(huì)在請(qǐng)求消息中將用戶信息以Cookie的形式發(fā)送給服務(wù)器,從而使服務(wù)器分辨出當(dāng)前請(qǐng)求是由哪個(gè)用戶發(fā)出的。Cookie的概念5.2.1什么是Cookie5.2.2Cookie

API先定一個(gè)小目標(biāo)!

先定一個(gè)小目標(biāo)!掌握Cookie類的構(gòu)造方法和常用方法Cookie類有且僅有一個(gè)構(gòu)造方法,具體語(yǔ)法格式如下:構(gòu)造方法publicCookie(java.lang.Stringname,java.lang.Stringvalue);在Cookie的構(gòu)造方法中,參數(shù)name用于指定Cookie的名稱,value用于指定Cookie的值。需要注意的是,Cookie一旦創(chuàng)建,它的名稱就不能再更改,Cookie的值可以為任何值,創(chuàng)建后允許被修改。5.2.2Cookie

APICookie類的常用方法5.2.2Cookie

API方法聲明功能描述StringgetName()用于返回Cookie的名稱voidsetValue(String

newValue)用于為Cookie設(shè)置一個(gè)新的值StringgetValue()用于返回Cookie的值voidsetMaxAge(int

expiry)用于設(shè)置Cookie在瀏覽器客戶機(jī)上保持有效的秒數(shù)intgetMaxAge()用于返回Cookie在瀏覽器客戶機(jī)上保持有效的秒數(shù)voidsetPath(String

uri)用于設(shè)置該Cookie項(xiàng)的有效目錄路徑StringgetPath()用于返回該Cookie項(xiàng)的有效目錄路徑voidsetDomain(String

pattern)用于設(shè)置該Cookie項(xiàng)的有效域StringgetDomain()用于返回該Cookie項(xiàng)的有效域voidsetVersion(int

v)用于設(shè)置該Cookie項(xiàng)采用的協(xié)議版本intgetVersion()用于返回該Cookie項(xiàng)采用的協(xié)議版本voidsetComment(String

purpose)用于設(shè)置該Cookie項(xiàng)的注解部分StringgetComment()用于返回該Cookie項(xiàng)的注解部分voidsetSecure(boolean

flag)用于設(shè)置該Cookie項(xiàng)是否只能使用安全的協(xié)議傳送booleangetSecure()用于返回該Cookie項(xiàng)是否只能使用安全的協(xié)議傳送setMaxAge(int

expiry)方法和getMaxAge()方法5.2.2Cookie

APIsetMaxAge(int

expiry)和getMaxAge()方法分別用于設(shè)置和返回Cookie在瀏覽器上保持有效的秒數(shù)。如果設(shè)置的值為一個(gè)正整數(shù),瀏覽器會(huì)將Cookie信息保存在本地硬盤中。從當(dāng)前時(shí)間開始,在沒(méi)有超過(guò)指定的秒數(shù)之前,這個(gè)Cookie都保持有效,并且同一臺(tái)計(jì)算機(jī)上運(yùn)行的該瀏覽器都可以使用這個(gè)Cookie信息。如果設(shè)置值為負(fù)整數(shù),瀏覽器會(huì)將Cookie信息保存在瀏覽器的緩存中,當(dāng)瀏覽器關(guān)閉時(shí),Cookie信息會(huì)被刪除。如果設(shè)置值為0,則瀏覽器會(huì)立即刪除這個(gè)Cookie信息。setPath(String

uri)方法和getPath()方法5.2.2Cookie

APIsetPath(String

uri)方法和getPath()方法是針對(duì)Cookie的Path屬性的。如果創(chuàng)建的某個(gè)Cookie對(duì)象沒(méi)有設(shè)置Path屬性,那么該Cookie只對(duì)當(dāng)前訪問(wèn)路徑所屬的目錄及其子目錄有效。如果想讓某個(gè)Cookie項(xiàng)對(duì)站點(diǎn)的所有目錄下的訪問(wèn)路徑都有效,應(yīng)調(diào)用Cookie對(duì)象的setPath()方法將其Path屬性設(shè)置為“/”。setDomain(String

pattern)方法和getDomain()方法5.2.2Cookie

APIsetDomain(String

pattern)方法和getDomain()方法是針對(duì)Cookie的domain屬性的。domain屬性用于指定瀏覽器訪問(wèn)的域。例如,傳智播客的域?yàn)椤啊薄TO(shè)置domain屬性時(shí),其值必須以“.”開頭,如domain=.。默認(rèn)情況下,domain屬性的值為當(dāng)前主機(jī)名,瀏覽器在訪問(wèn)當(dāng)前主機(jī)下的資源時(shí),都會(huì)將Cookie信息發(fā)送給服務(wù)器(當(dāng)前主機(jī))。需要注意的是,domain屬性的值不區(qū)分大小寫。任務(wù):顯示用戶上次訪問(wèn)時(shí)間先定一個(gè)小目標(biāo)!

先定一個(gè)小目標(biāo)!使用Cookie技術(shù),實(shí)現(xiàn)顯示用戶上次的訪問(wèn)時(shí)間的功能任務(wù):顯示用戶上次訪問(wèn)時(shí)間當(dāng)用戶訪問(wèn)某些Web應(yīng)用時(shí),經(jīng)常會(huì)顯示出該用戶上一次的訪問(wèn)時(shí)間。例如,QQ登錄成功后,會(huì)顯示用戶上次的登錄時(shí)間。本案例要求使用Cookie技術(shù)實(shí)現(xiàn)顯示用戶上次的訪問(wèn)時(shí)間。顯示用戶上次訪問(wèn)時(shí)間效果如下圖所示。任務(wù):顯示用戶上次訪問(wèn)時(shí)間在IDEA中新建Web項(xiàng)目chapter05并添加Servlet-api.jar包,在chapter05項(xiàng)目的src包中編寫一個(gè)名稱為L(zhǎng)astAccessServlet的Servlet類,該類主要用于獲取Cookie信息中的時(shí)間并發(fā)送給客戶端。主要代碼如下:publicclassLastAccessServletextendsHttpServlet{privatestaticfinallongserialVersionUID=1L;publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{//指定服務(wù)器輸出內(nèi)容的編碼方式UTF-8,防止發(fā)生亂碼response.setContentType("text/html;charset=utf-8");//獲取所有cookieCookie[]cookies=request.getCookies();//定義flag的boolean變量,用于判斷cookies是否為空booleanflag=false; //遍歷cookie數(shù)組if(cookies.length>0&&cookies!=null){for(Cookiecookie:cookies){//獲取cookie的名稱Stringname=cookie.getName();STEP01任務(wù):顯示用戶上次訪問(wèn)時(shí)間//判斷名稱是否是lastTimeif("lastTime".equals(name)){//有該cookie不是第一次訪問(wèn)flag=true; //響應(yīng)數(shù)據(jù)//獲取cookie的value時(shí)間Stringvalue=cookie.getValue();System.out.println("解碼前:"+value);//URL解碼value=URLDecoder.decode(value,"utf-8");System.out.println("解碼后:"+value);response.getWriter().write("歡迎回來(lái),您上次訪問(wèn)時(shí)間為:"+value);//設(shè)置cookie的value//獲取當(dāng)前時(shí)間的字符串,重新設(shè)置cookie的值,重新發(fā)送cookieDatedate=newDate();SimpleDateFormattimesdf=newSimpleDateFormat("yyyy年MM月dd日HH:mm:ss");Stringstr_time=timesdf.format(date);System.out.println("編碼前:"+str_time);//URL編碼str_time=URLEncoder.encode(str_time,"utf-8");任務(wù):顯示用戶上次訪問(wèn)時(shí)間 System.out.println("編碼后:"+str_time);cookie.setValue(str_time);//設(shè)置cookie存活時(shí)間cookie.setMaxAge(60*60*24*30); //一個(gè)月//加入當(dāng)前cookie請(qǐng)求時(shí)間response.addCookie(cookie);break;}}//如果cookies中沒(méi)有時(shí)間,也就是沒(méi)有訪問(wèn)過(guò)if(cookies==null||cookies.length==0||flag==false){//設(shè)置cookie的value//獲取當(dāng)前時(shí)間的字符串,重新設(shè)置cookie的值,重新發(fā)送cookieDatedate=newDate();SimpleDateFormatsdf=newSimpleDateFormat("yyyy年MM月dd日HH:mm:ss");Stringstr_date=sdf.format(date);System.out.println("編碼前:"+str_date);//URL編碼str_date=URLEncoder.encode(str_date,"utf-8");System.out.println("編碼后:"+str_date);Cookiecookie=newCookie("lastTime",str_date);任務(wù):顯示用戶上次訪問(wèn)時(shí)間//設(shè)置cookie存活時(shí)間cookie.setMaxAge(60*60*24*30);//一個(gè)月response.addCookie(cookie);response.getWriter().write("您好,歡迎您首次訪問(wèn)");}}}任務(wù):顯示用戶上次訪問(wèn)時(shí)間啟動(dòng)IDEA中的Tomcat服務(wù)器,在瀏覽器的地址欄中輸入“http://localhost:8080/chapter05/LastAccessServlet”訪問(wèn)LastAccessServlet,由于是第一次訪問(wèn)LastAccessServlet,會(huì)在瀏覽器中看到“您好,歡迎您首次訪問(wèn)”的信息:STEP02任務(wù):顯示用戶上次訪問(wèn)時(shí)間刷新訪問(wèn)地址“http://localhost:8080/chapter05/LastAccessServlet,瀏覽器顯示了用戶的上次訪問(wèn)時(shí)間,這是因?yàn)橛脩舻谝淮卧L問(wèn)LastAccessServlet時(shí),LastAccessServlet向?yàn)g覽器發(fā)送并保存用戶訪問(wèn)時(shí)間的Cookie信息。第二次訪問(wèn)LastAccessServlet時(shí),服務(wù)器讀取該Cookie信息,并在瀏覽器顯示:STEP03任務(wù):顯示用戶上次訪問(wèn)時(shí)間關(guān)閉瀏覽器后,再次打開瀏覽器,訪問(wèn)LastAccessServlet,瀏覽器依舊顯示了時(shí)間,是因?yàn)槲覀冊(cè)贚astAccessServlet類的代碼中設(shè)置了Cookie的有效時(shí)間為1個(gè)月。瀏覽器顯示:STEP04Session對(duì)象5.35.3.1什么是Session先定一個(gè)小目標(biāo)!

先定一個(gè)小目標(biāo)!了解什么是SessionSession對(duì)象5.3.1什么是Session當(dāng)人們?nèi)メt(yī)院就診時(shí),就診病人需要辦理醫(yī)院的就診卡,就診卡上只有卡號(hào),沒(méi)有其他信息。但病人每次去該醫(yī)院就診時(shí),只要出示就診卡,醫(yī)務(wù)人員便可根據(jù)卡號(hào)查詢到病人的就診信息。Session技術(shù)類似醫(yī)院辦理就診卡和醫(yī)院為每個(gè)病人保留病歷檔案的過(guò)程。當(dāng)瀏覽器訪問(wèn)Web服務(wù)器時(shí),Servlet容器就會(huì)創(chuàng)建一個(gè)Session對(duì)象和ID屬性,Session對(duì)象就相當(dāng)于病歷檔案,ID就相當(dāng)于就診卡號(hào)。當(dāng)客戶端后續(xù)訪問(wèn)服務(wù)器時(shí),只要將ID傳遞給服務(wù)器,服務(wù)器就能判斷出該請(qǐng)求是哪個(gè)客戶端發(fā)送的,從而選擇與之對(duì)應(yīng)的Session對(duì)象為其服務(wù)。Session對(duì)象5.3.1什么是Session為了使讀者更好的理解Session,下面以網(wǎng)站購(gòu)物為例,通過(guò)一張圖描述Session保存用戶信息的原理。網(wǎng)站購(gòu)物圖解析5.3.1什么是Session用戶甲和用戶乙都調(diào)用buyServlet將商品添加到購(gòu)物車,調(diào)用payServlet進(jìn)行商品結(jié)算。由于甲和乙購(gòu)買商品的過(guò)程類似,在此,以用戶甲為例進(jìn)行詳細(xì)說(shuō)明。當(dāng)用戶甲訪問(wèn)購(gòu)物網(wǎng)站時(shí),服務(wù)器為甲創(chuàng)建了一個(gè)Session對(duì)象(相當(dāng)于購(gòu)物車)。當(dāng)甲將iPhone手機(jī)添加到購(gòu)物車時(shí),iPhone手機(jī)的信息便存放到了Session對(duì)象中。同時(shí),服務(wù)器將Session對(duì)象的ID屬性以Cookie(Set-Cookie:JSESSIONID=111)的形式返回給甲的瀏覽器。當(dāng)甲完成購(gòu)物進(jìn)行結(jié)賬時(shí),需要向服務(wù)器發(fā)送結(jié)賬請(qǐng)求,這時(shí),瀏覽器自動(dòng)在請(qǐng)求消息頭中將Cookie(Cookie:JSESSIONID=111)信息發(fā)送給服務(wù)器,服務(wù)器根據(jù)ID屬性找到為用戶甲所創(chuàng)建的Session對(duì)象,并將Session對(duì)象中所存放的iPhone手機(jī)信息取出進(jìn)行結(jié)算。Session對(duì)象5.3.1什么是SessionSession還具有更高的安全性,它將關(guān)鍵數(shù)據(jù)保存在服務(wù)器。cookie則是將數(shù)據(jù)存在客戶端的瀏覽器中。因此cookie是較為危險(xiǎn)的,若客戶端遭遇黑客攻擊,cookie信息容易被竊取,數(shù)據(jù)也可能被篡改,而運(yùn)用Session可以有效避免這種情況的發(fā)生。5.3.2HttpSessionAPI先定一個(gè)小目標(biāo)!

先定一個(gè)小目標(biāo)!掌握HttpSession接口中的常用方法5.3.2HttpSessionAPISession是與每個(gè)請(qǐng)求消息緊密相關(guān)的,為此,HttpServletRequest定義了用于獲取Session對(duì)象的getSession()方法,該方法有兩種重載形式,具體如下:Session對(duì)象的getSession()方法publicHttpSessiongetSession(boolean

create)//第一個(gè)publicHttpSessiongetSession()//第二個(gè)5.3.2HttpSessionAPISession對(duì)象的getSession()方法第一個(gè)getSession()方法根據(jù)傳遞的參數(shù)判斷是否創(chuàng)建新的HttpSession對(duì)象,如果參數(shù)為true,則在相關(guān)的HttpSession對(duì)象不存在時(shí)創(chuàng)建并返回新的HttpSession對(duì)象,否則不創(chuàng)建新的HttpSession對(duì)象,而是返回null。5.3.2HttpSessionAPISession對(duì)象的getSession()方法第二個(gè)getSession()方法相當(dāng)于第一個(gè)方法參數(shù)為true時(shí)的情況,在相關(guān)的HttpSession對(duì)象不存在時(shí)總是創(chuàng)建新的HttpSession對(duì)象。需要注意的是,由于getSession()方法可能會(huì)產(chǎn)生發(fā)送會(huì)話標(biāo)識(shí)號(hào)的Cookie頭字段,所以必須在發(fā)送任何響應(yīng)內(nèi)容之前調(diào)用getSession()方法。5.3.2HttpSessionAPIHttpSession接口中的常用方法方法聲明功能描述StringgetId()用于返回與當(dāng)前HttpSession對(duì)象關(guān)聯(lián)的會(huì)話標(biāo)識(shí)號(hào)longgetCreationTime()用于返回Session創(chuàng)建的時(shí)間,這個(gè)時(shí)間是創(chuàng)建Session的時(shí)間與1970年1月1日00:00:00之間時(shí)間差的毫秒表示形式longgetLastAccessedTime()用于返回客戶端最后一次發(fā)送與Session相關(guān)請(qǐng)求的時(shí)間,這個(gè)時(shí)間是發(fā)送請(qǐng)求的時(shí)間與1970年1月1日00:00:00之間時(shí)間差的毫秒表示形式voidsetMaxInactiveInterval(intinterval)用于設(shè)置當(dāng)前HttpSession對(duì)象可空閑的以秒為單位的最長(zhǎng)時(shí)間,也就是修改當(dāng)前會(huì)話的默認(rèn)超時(shí)間隔booleanisNew()判斷當(dāng)前HttpSession對(duì)象是否是新創(chuàng)建的voidinvalidate()用于強(qiáng)制使Session對(duì)象無(wú)效ServletContextgetServletContext()用于返回當(dāng)前HttpSession對(duì)象所屬于的Web應(yīng)用程序?qū)ο螅创懋?dāng)前Web應(yīng)用程序的ServletContext對(duì)象voidsetAttribite(Stringname,Objectvalue)用于將一個(gè)對(duì)象與一個(gè)名稱關(guān)聯(lián)后存儲(chǔ)到當(dāng)前的HttpSession對(duì)象中StringgetAttribute()用于從當(dāng)前HttpSession對(duì)象中返回指定名稱的屬性對(duì)象voidremoveAttribute(Stringname)用于從當(dāng)前HttpSession對(duì)象中刪除指定名稱的屬性5.3.3Session的生命周期先定一個(gè)小目標(biāo)!

先定一個(gè)小目標(biāo)!掌握Session對(duì)象的生效與失效Session生效Sessinon在用戶第一次訪問(wèn)服務(wù)器時(shí)創(chuàng)建,需要注意只有訪問(wèn)JSP(JSP將在第6章講解)、Servlet等程序時(shí)才會(huì)創(chuàng)建Session。此外,還可調(diào)用request.getSession(true)強(qiáng)制生成Session。只訪問(wèn)HTML、IMAGE等靜態(tài)資源并不會(huì)創(chuàng)建Session。5.3.3Session的生命周期Session失效—“超時(shí)限制”判斷Session是否生效Web服務(wù)器采用“超時(shí)限制”判斷客戶端是否還在繼續(xù)訪問(wèn)。在一定時(shí)間內(nèi),如果某個(gè)客戶端一直沒(méi)有請(qǐng)求訪問(wèn),那么,Web服務(wù)器就會(huì)認(rèn)為該客戶端已經(jīng)結(jié)束請(qǐng)求,并且將與該客戶端會(huì)話所對(duì)應(yīng)的HttpSession對(duì)象變成垃圾對(duì)象,等待垃圾收集器將其從內(nèi)存中徹底清除。反之,如果瀏覽器超時(shí)后,再次向服務(wù)器發(fā)出請(qǐng)求訪問(wèn),那么,Web服務(wù)器會(huì)創(chuàng)建一個(gè)新的HttpSession對(duì)象,并為其分配一個(gè)新的ID屬性。5.3.3Session的生命周期Session失效—強(qiáng)制Session失效invalidate()方法,該方法可以強(qiáng)制使Session對(duì)象失效,具體用法如下所示:5.3.3Session的生命周期HttpSessionsession=request.getSession();session.invalidate();//注銷該request的所有sessionSession失效—強(qiáng)制Session失效有時(shí)默認(rèn)的Session失效時(shí)間并不能滿足我們的需求。這時(shí)我們需要自定義Session的失效時(shí)間,自定義Session的失效時(shí)間有3種:5.3.3Session的生命周期<session-config><session-timeout>30</session-timeout></session-config>第1種在項(xiàng)目的web.xml文件中配置Session的失效時(shí)間,具體代碼如下所示:需要注意的是,在web.xml配置的Session失效時(shí)間默認(rèn)是分鐘,所以上述代碼設(shè)置Session失效時(shí)間為30分鐘。5.3.3Session的生命周期session.setMaxInactiveInterval(30*60);//設(shè)置單位為秒,設(shè)置為-1永不過(guò)期第2種在Servlet程序中手動(dòng)設(shè)置Session的失效時(shí)間,具體代碼如下所示:<session-config><session-timeout>30</session-timeout></session-config>第3種上述代碼設(shè)置了Session的失效時(shí)間為30分鐘,如果將值設(shè)置為-1,則該Session永不過(guò)期。在<Tomcat安裝目錄>\conf\web.xml文件中,可以找到如下一段配置信息:在上述代碼的配置信息中,設(shè)置的時(shí)間值是以分鐘為單位的,即Tomcat服務(wù)器的默認(rèn)會(huì)話超時(shí)間隔為30分鐘。如果將<session-timeout>元素中的時(shí)間值設(shè)置成0或負(fù)數(shù),則表示會(huì)話永不超時(shí)。需要注意的是<Tomcat安裝目錄>\conf\web.xml文件對(duì)站點(diǎn)內(nèi)的所有Web應(yīng)用程序都起作用。5.3.3Session的生命周期Session失效—強(qiáng)制Session失效任務(wù):實(shí)現(xiàn)購(gòu)物車先定一個(gè)小目標(biāo)!

先定一個(gè)小目標(biāo)!使用Session相關(guān)知識(shí),實(shí)現(xiàn)模擬購(gòu)物車的功能任務(wù):實(shí)現(xiàn)購(gòu)物車通過(guò)所學(xué)Session知識(shí)及購(gòu)物車的訪問(wèn)流程,以購(gòu)買蛋糕為例,模擬實(shí)現(xiàn)購(gòu)物車功能。購(gòu)物車的訪問(wèn)流程具體如下圖所示。圖中描述的是購(gòu)物車的實(shí)現(xiàn)流程,當(dāng)用戶使用瀏覽器訪問(wèn)某個(gè)網(wǎng)站的蛋糕列表頁(yè)面時(shí),如果購(gòu)買某個(gè)蛋糕,那么首先會(huì)判斷蛋糕是否存在,如果存在就加入購(gòu)物車,跳轉(zhuǎn)到購(gòu)物車中所購(gòu)買蛋糕的列表頁(yè)面。否則,返回蛋糕列表頁(yè)面。任務(wù):實(shí)現(xiàn)購(gòu)物車創(chuàng)建封裝蛋糕信息的類,在chapter05項(xiàng)目下新建一個(gè)名稱為cn.itcast.session.entity的包,在該包中創(chuàng)建一個(gè)名稱為Cake的類。主要代碼如下:publicclassCake{ privatestaticfinallongserialVersionUID=1L; privateStringid; privateStringname; publicCake(){ } publicCake(Stringid,Stringname){ this.id=id; =name; } ......省略getter/setter方法}STEP01任務(wù):實(shí)現(xiàn)購(gòu)物車創(chuàng)建數(shù)據(jù)庫(kù)模擬類,在cn.itcast.session.entity包中創(chuàng)建一個(gè)名稱為CakeDB的類,該類用于模擬保存所有蛋糕的數(shù)據(jù)庫(kù)。主要代碼如下:publicclassCakeDB{privatestaticMap<String,Cake>cake=newLinkedHashMap<String,Cake>();static{cake.put("1",newCake("1","A類蛋糕"));cake.put("2",newCake("2","B類蛋糕"));cake.put("3",newCake("3","C類蛋糕"));cake.put("4",newCake("4","D類蛋糕"));cake.put("5",newCake("5","E類蛋糕"));}//獲得所有的蛋糕publicstaticCollection<Cake>getAll(){returncake.values();}//根據(jù)指定的id獲蛋糕publicstaticCakegetCake(Stringid){returncake.get(id);}}STEP02任務(wù):實(shí)現(xiàn)購(gòu)物車創(chuàng)建Servlet,創(chuàng)建一個(gè)名稱為L(zhǎng)istCakeServlet的Servlet類,該Servlet用于顯示所有可購(gòu)買蛋糕的列表,通過(guò)單擊“購(gòu)買”鏈接,便可將指定的蛋糕添加到購(gòu)物車中。主要代碼如下:publicclassListCakeServletextendsHttpServlet{privatestaticfinallongserialVersionUID=1L;publicvoiddoGet(HttpServletRequestreq,HttpServletResponseresp)throwsServletException,IOException{resp.setContentType("textml;charset=utf-8");PrintWriterout=resp.getWriter();Collection<Cake>cakes=CakeDB.getAll();out.write("本站提供的蛋糕有:<br>");for(Cakecake:cakes){Stringurl="PurchaseServlet?id="+cake.getId();out.write(cake.getName()+"<ahref='"+url+"'>點(diǎn)擊購(gòu)買</a><br>");}}}STEP03任務(wù):實(shí)現(xiàn)購(gòu)物車創(chuàng)建一個(gè)名稱為PurchaseServlet的Servlet類,該類實(shí)現(xiàn)了兩個(gè)功能,一個(gè)是將用戶購(gòu)買的蛋糕信息保存到Session對(duì)象中,一個(gè)是在用戶購(gòu)買蛋糕結(jié)束后,將頁(yè)面重定向到用戶已經(jīng)購(gòu)買的蛋糕列表。主要代碼如下:@WebServlet(name="PurchaseServlet",urlPatterns="/PurchaseServlet")publicclassPurchaseServletextendsHttpServlet{privatestaticfinallongserialVersionUID=1L;publicvoiddoGet(HttpServletRequestreq,HttpServletResponseresp)throwsServletException,IOException{//獲得用戶購(gòu)買的商品Stringid=req.getParameter("id");if(id==null){//如果id為null,重定向到ListBookServlet頁(yè)面Stringurl="ListBookServlet";resp.sendRedirect(url);return;}Cakebook=CakeDB.getCake(id);STEP04任務(wù):實(shí)現(xiàn)購(gòu)物車//創(chuàng)建或者獲得用戶的Session對(duì)象HttpSessionsession=req.getSession();//從Session對(duì)象中獲得用戶的購(gòu)物車List<Cake>cart=(List)session.getAttribute("cart");if(cart==null){//首次購(gòu)買,為用戶創(chuàng)建一個(gè)購(gòu)物車(List集合模擬購(gòu)物車)cart=newArrayList<Cake>();//將購(gòu)物城存入Session對(duì)象session.setAttribute("cart",cart);}//將商品放入購(gòu)物車cart.add(book);//創(chuàng)建Cookie存放Session的標(biāo)識(shí)號(hào)Cookiecookie=newCookie("JSESSIONID",session.getId());cookie.setMaxAge(60*30);cookie.setPath("/Servlet");resp.addCookie(cookie);//重定向到購(gòu)物車頁(yè)面Stringurl="CartServlet";resp.sendRedirect(url);}}任務(wù):實(shí)現(xiàn)購(gòu)物車創(chuàng)建一個(gè)名稱為CartServlet的Servlet類,該類主要用于展示用戶已經(jīng)購(gòu)買的蛋糕列表,其實(shí)現(xiàn)代碼如下:@WebServlet(name="CartServlet",urlPatterns="/CartServlet")publicclassCartServletextendsHttpServlet{ publicvoiddoGet(HttpServletRequestreq,HttpServletResponseresp) throwsServletException,IOException{ resp.setContentType("text/html;charset=utf-8"); PrintWriterout=resp.getWriter(); //變量cart引用用戶的購(gòu)物車 List<Cake>cart=null; //變量purFlag標(biāo)記用戶是否買過(guò)商品 booleanpruFlag=true; //獲得用戶的session HttpSessionsession=req.getSession(false);STEP05任務(wù):實(shí)現(xiàn)購(gòu)物車

//如果session為null,則purFlag置為false if(session==null){ purFlag=false; }else{ //獲得用戶購(gòu)物車 cart=(List)session.getAttribute("cart"); //如果用的購(gòu)物車為null,則purFlag置為false if(cart==null){ purFlag=false; } } if(!purFlag){ out.write("對(duì)不起!您還沒(méi)有購(gòu)買任何商品!<br>"); }else{ //否則顯示用戶購(gòu)買蛋糕的信息 out.write("您購(gòu)買的蛋糕有:<br>"); doubleprice=0; for(Cakecake:cart){ out.write(cake.getName()+"<br>"); } } }}任務(wù):實(shí)現(xiàn)購(gòu)物車在IDEA中啟動(dòng)Tomcat服務(wù)器,在瀏覽器中輸入地址“http://localhost:8080/chapter05/ListCakeServlet”訪問(wèn)ListCakeServlet,運(yùn)行如下:STEP06任務(wù):實(shí)現(xiàn)購(gòu)物車單擊“STEP05”中“A類蛋糕”后的“點(diǎn)擊購(gòu)買”鏈接,瀏覽器顯示的結(jié)果如下:STEP07任務(wù):實(shí)現(xiàn)購(gòu)物車再次訪問(wèn)ListBookServlet,選擇“B類蛋糕”后的“點(diǎn)擊購(gòu)買”鏈接,瀏覽器顯示的結(jié)果如下:STEP08任務(wù):應(yīng)用Session對(duì)象模擬用戶登錄先定一個(gè)小目標(biāo)!

先定一個(gè)小目標(biāo)!使用Session相關(guān)知識(shí),實(shí)現(xiàn)模擬用戶登錄的功能任務(wù):應(yīng)用Session對(duì)象模擬用戶登錄通過(guò)所學(xué)Session知識(shí),學(xué)會(huì)如何使用Session技術(shù)實(shí)現(xiàn)用戶登錄的功能。為了使讀者可以更直觀的了解用戶登錄的流程,接下來(lái),通過(guò)一張圖來(lái)描述用戶登錄的流程,具體如下圖所示。任務(wù):應(yīng)用Session對(duì)象模擬用戶登錄上圖中描述了用戶登錄的整個(gè)流程,當(dāng)用戶訪問(wèn)某個(gè)網(wǎng)站的首界面時(shí),首先會(huì)判斷用戶是否登錄,如果已經(jīng)登錄則在首界面中顯示用戶登錄信息,否則進(jìn)入登錄頁(yè)面,完成用戶登錄功能,然后顯示用戶登錄信息。在用戶登錄的情況下,如果單擊用戶登錄界面中的“退出”時(shí),就會(huì)注銷當(dāng)前用戶的信息,返回首界面。任務(wù):應(yīng)用Session對(duì)象模擬用戶登錄創(chuàng)建封裝用戶信息類,在chapter05項(xiàng)目的src目錄下的cn.itcast.session.entity包中編寫一個(gè)名稱為User的類。主要代碼如下:publicclassUser{ privateStringusername; privateStringpassword; publicStringgetUsername(){returnusername;} publicvoidsetUsername(Stringusername){this.username=username;} publicStringgetPassword(){returnpassword;} publicvoidsetPassword(Stringpassword){this.password=password;}}STEP01任務(wù):應(yīng)用Session對(duì)象模擬用戶登錄創(chuàng)建Servlet,在cn.itcast.session.servlet包中編寫IndexServlet類,該類用于顯示網(wǎng)站的首界面。主要代碼如下:publicclassIndexServletextendsHttpServlet{ publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse) throwsServletException,IOException{ //解決亂碼問(wèn)題 response.setContentType("text/html;charset=utf-8"); //創(chuàng)建或者獲取保存用戶信息的Session對(duì)象 HttpSessionsession=request.getSession(); Useruser=(User)session.getAttribute("user"); if(user==null){ response.getWriter().print( "您還沒(méi)有登錄,請(qǐng)<ahref='/chapter05/login.html'>登錄</a>"); }else{response.getWriter().print("您已登錄,歡迎你,"+user.getUsername()+"!"); response.getWriter().print("<ahref='/chapter05/LogoutServlet'>退出</a>"); //創(chuàng)建Cookie存放Session的標(biāo)識(shí)號(hào) Cookiecookie=newCookie("JSESSIONID",session.getId()); cookie.setMaxAge(60*30);STEP02任務(wù):應(yīng)用Session對(duì)象模擬用戶登錄 cookie.setPath("/chapter05"); response.addCookie(cookie); } } publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse) throwsServletException,IOException{ doGet(request,response); }}任務(wù):應(yīng)用Session對(duì)象模擬用戶登錄創(chuàng)建Servlet,在cn.itcast.session.servlet包中編寫LoginServlet,該Servlet用于顯示用戶登

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 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)論