我們上次說了當(dāng)一個(gè)客戶端第一次訪問網(wǎng)站時(shí),服務(wù)器就會(huì)為這個(gè)客戶端創(chuàng)建一個(gè)session,那么我們可以在某一時(shí)刻通過session的存活數(shù)量知道當(dāng)前有多少客戶端在線,那么問題是我們?cè)趺床拍苤滥骋粫r(shí)間內(nèi)有多少個(gè)session存活呢?我們可以自己寫一個(gè)累加器幫我們完成,當(dāng)一個(gè)新的客戶端訪問服務(wù)器時(shí)就要?jiǎng)?chuàng)建一個(gè)新的session這是當(dāng)我們session被創(chuàng)建時(shí)我們將計(jì)數(shù)器加1,反之如果一個(gè)session長(zhǎng)時(shí)間沒有用超出了設(shè)置的超時(shí)時(shí)間session就會(huì)被銷毀,我們就在它銷毀的時(shí)候?qū)⒂?jì)數(shù)器減1,這樣我們就可以知道當(dāng)前有多少人在線了。其實(shí)我們可以通過上面的這個(gè)例子看出我們?cè)趯?duì)session的創(chuàng)建和銷毀進(jìn)行監(jiān)聽,沒錯(cuò),這個(gè)例子正是session的監(jiān)聽器。那么我們來看一下代碼如何寫。
首先我們創(chuàng)建一個(gè)主頁 index.jsp









































上面這個(gè)index.jsp 頁面的作用是讓我們點(diǎn)擊提交按鈕后進(jìn)入 success.jsp 頁面中,而在success.jsp中可以看到當(dāng)前在線人數(shù)的數(shù)量,當(dāng)然要在這里注意一點(diǎn)的是當(dāng)我們?cè)L問index.jsp時(shí)服務(wù)器端的session就已經(jīng)被創(chuàng)建了,而不是當(dāng)我們點(diǎn)擊完提交按鈕后才創(chuàng)建的。也就是說當(dāng)我們已打開index.jsp頁面時(shí)我們的計(jì)數(shù)器就已經(jīng)加1了,而點(diǎn)擊提交按鈕只是將我們的計(jì)數(shù)器中的值取出來。
我們?cè)偃?chuàng)建一個(gè)包,包的名字叫:listener
我們?cè)僭趌istener包中創(chuàng)建一個(gè)類,名字是:SessionLis
SessionLis源碼如下:









































































































上面這個(gè)類的作用,上看過以后基本都清楚了主要使用來監(jiān)聽session的創(chuàng)建與銷毀的,有人又會(huì)問老師,那么是不是我隨便寫一個(gè)類讓它實(shí)現(xiàn)HttpSessionListener接口就可以直接對(duì)session進(jìn)行監(jiān)聽了,當(dāng)然不是。既然我們要監(jiān)聽我們就要通知Tomcat容器讓它知道呀所以我們還需要在web.xml中進(jìn)行注冊(cè)一下這樣我們的Tomcat容器就知道了。我們打開web.xml文件修改代碼:

























下面我們創(chuàng)建剛才在index.jsp中提到過的 success.jsp頁面。
success.jsp源碼:



















































上面這段代碼中出現(xiàn)了一段javascrit代碼里面有一個(gè)function名字叫 aa 這段代碼的功能是當(dāng)用戶點(diǎn)擊下線按鈕時(shí),調(diào)用這段腳本,將本頁面的請(qǐng)求提交到destroy.jsp頁面,這個(gè)頁面是用來銷毀session 。在上面的代碼中還出現(xiàn)了
<%=application.getAttribute("num")%> 因?yàn)槲覀冊(cè)诒O(jiān)聽器類中將計(jì)數(shù)器存放到了application中我們要顯示存放內(nèi)容只有從application中將其num的值取出。有些同學(xué)又問了問什么你不將計(jì)數(shù)器的值存放到session中而存放到application我們一起來想一下,我們要顯示的在線人數(shù)是讓所用用戶看的而session只是針對(duì)于一個(gè)客戶端的,如果我們用session保存,我們就不能夠讓所用用戶看見,只有application中的值是整個(gè)web應(yīng)用程序的,所以我們將其值保存到了application中。
下面我們?cè)賮韯?chuàng)建一個(gè)destroy.jsp頁面用來銷毀session。
destroy.jsp源代碼:









上面的代碼中<%session.invalidate(); %>表示我們讓當(dāng)前session銷毀。
有些同學(xué)又會(huì)問,老師不是session有自己的過期時(shí)間嗎?為什么還要我們?nèi)フ{(diào)用方法讓它銷毀呢?我們大家都去過126、163 新浪、雅虎的信箱,當(dāng)我們登陸進(jìn)去以后都會(huì)發(fā)現(xiàn)有一個(gè)按鈕“安全退出”為什么呢,其實(shí)我們上面已經(jīng)說了在監(jiān)聽器SessionLis類中我在session的創(chuàng)建方法中的最后一句代碼上面寫了一句注釋:
/*
*為session設(shè)置超時(shí)時(shí)間
*但這里需要注意即使超時(shí)時(shí)間到了session對(duì)象不一定
*會(huì)被銷毀,應(yīng)為什么時(shí)候銷毀不是由我們?nèi)藶闆Q定的
*是由容器Tomcat所決定的。
*/
我們假設(shè)一下如果張三在網(wǎng)吧上網(wǎng)進(jìn)入了自己的信箱,但是剛上了3分鐘就去新浪網(wǎng)了,有過了5分鐘張三走了,沒有關(guān)閉瀏覽器,這時(shí)由于張三登陸的session沒有銷毀所以后來的李四就可以用剛才張三打開的瀏覽器后退而不需密碼的進(jìn)入張三的信箱。而服務(wù)器有沒有辦法檢測(cè)到張三什么時(shí)候離開的,張三離開了而服務(wù)器端的session過期時(shí)間沒有到session沒有銷毀,即使時(shí)間到了session也不會(huì)馬上銷毀還要有容器決定,這樣就會(huì)很不安全,所以設(shè)置了一個(gè)安全退出,而這個(gè)方法可以馬上可以讓當(dāng)前的session銷毀掉,以保障當(dāng)前用戶的信息安全。這也就是為什么各個(gè)信箱設(shè)置“安全退出”的原因了。
好了,在session的使用中有個(gè)很常用的方法 session.setAttribut(key,valueObject)當(dāng)我們想為當(dāng)前用戶設(shè)置或保存某種狀態(tài)時(shí)用這個(gè)方法。在這句代碼中兩個(gè)參數(shù),因?yàn)槲覀兛梢詾楫?dāng)前session 中存放多個(gè)值,而我們?nèi)绾稳≈的兀课以趺粗廊〉檬遣皇俏蚁胍闹的兀克跃陀靡粋€(gè)key鍵來進(jìn)行標(biāo)示,一個(gè)key對(duì)應(yīng)的一個(gè)值,比如我現(xiàn)在向當(dāng)前session中存放了3個(gè)值:






如果我現(xiàn)在想取出值為“山西太原清華IT學(xué)習(xí)認(rèn)證中心”的內(nèi)容,如何來取呢?我們可以通過 session.getAttribut(“qhit”); 來獲取鍵為qhit所對(duì)應(yīng)的值“山西太原清華IT學(xué)習(xí)認(rèn)證中心”。
好了,通過這個(gè)例子,相信大家應(yīng)該對(duì)session的應(yīng)用和它的作用域有一定的了解,如果還有什么不清楚的可以留言。(session的介紹結(jié))