官术网_书友最值得收藏!

4.5 session對象

session(會話)對象是類javax.servlet.Httpsession的一個對象。session是從客戶端連接服務(wù)器開始,直到與服務(wù)器斷開連接為止。session對象用于保存每個與服務(wù)器建立連接的客戶端的信息,session的ID保存于客戶端的Cookie中,這個sessionID標(biāo)識唯一的用戶,與其他用戶的sessionID不同。接下來針對session的概念與其中數(shù)據(jù)的處理方式進行討論。

4.5.1 session的概念

session存在于服務(wù)器端,當(dāng)客戶端用戶向服務(wù)器提出請求打開網(wǎng)頁時,若該網(wǎng)頁中包含了為用戶建立session的程序代碼,則session便會產(chǎn)生。這個session可用來存放屬于該用戶的數(shù)據(jù),且每一份網(wǎng)頁都可以使用這個session中的內(nèi)容,不過由于每一個session都是獨立的,且其中數(shù)據(jù)內(nèi)容互不相干,對不同的用戶來說,網(wǎng)頁所讀取的數(shù)據(jù)也就不同。如圖4-20所示為session數(shù)據(jù)存取的方式。

圖4-20 session數(shù)據(jù)存取方式示意圖

在服務(wù)器內(nèi)部可能會由于有多個不同的用戶同時上線而建立多個session,這樣,當(dāng)用戶向服務(wù)器提出請求時,服務(wù)器端會用以下方法來辨別該用戶屬于哪一個session:當(dāng)服務(wù)器為某一用戶建立session之后,會給session一個用于識別的字符串,此字符串?dāng)?shù)據(jù)還會被傳送到客戶端并記錄在瀏覽器的Cookie中,當(dāng)用戶再度向服務(wù)器提出請求時,此字符串?dāng)?shù)據(jù)便會一并傳送,這樣,服務(wù)器端在收到此字符串?dāng)?shù)據(jù)后,再與各session的標(biāo)識符串進行對比后,便可知道用戶擁有哪一份session數(shù)據(jù)。

4.5.2 session對象的ID

當(dāng)一個客戶首次訪問服務(wù)器上的一個JSP頁面時,JSP引擎產(chǎn)生一個session對象,同時分配一個String類型的ID號,JSP引擎同時將這個ID號發(fā)送到客戶端,存放在Cookie(Cookie是Web服務(wù)器保存在用戶硬盤上的一段文本)中,這樣session對象和客戶之間就建立了一一對應(yīng)的關(guān)系。當(dāng)客戶再訪問連接該服務(wù)器的其他頁面時,不再分配給客戶新的session對象,直到客戶關(guān)閉瀏覽器后,服務(wù)器端該客戶的session對象才取消,并且和客戶的會話對應(yīng)關(guān)系消失。當(dāng)客戶重新打開瀏覽器再連接到該服務(wù)器時,服務(wù)器為該客戶再創(chuàng)建一個新的session對象。

采用getId()方法返回session對象在服務(wù)器端的編號。每生成一個session對象,服務(wù)器都會給它一個編號,并且該編號不會重復(fù),這樣服務(wù)器才能根據(jù)編號來識別session,并且正確地處理某一特定的session及其提供的服務(wù)。

4.5.3 session的有效期限

session和application相同,有其存在的期限,當(dāng)以下4種情況發(fā)生其一時,session與其中的數(shù)據(jù)便會清空。

用戶關(guān)閉當(dāng)前正在使用的瀏覽器程序。

關(guān)閉網(wǎng)頁服務(wù)器。

用戶未向服務(wù)器提出請求超過預(yù)設(shè)的時間,Tomcat服務(wù)器預(yù)設(shè)為30分鐘。

運行程序結(jié)束session。

簡要介紹了session之后,接下來將進一步討論使用session內(nèi)置對象處理session中數(shù)據(jù)的方式。

4.5.4 訪問session中的數(shù)據(jù)

session對象是由HttpSession接口衍生而來的,在該接口下提供了訪問session數(shù)據(jù)的方法。

1. 建立session變量

在JSP中不需要特別設(shè)置程序代碼來建立用戶session,當(dāng)程序使用了session對象時,便會自動建立session,而下面這行語句便是在session中新增變量數(shù)據(jù)的方式:

     session.setAttribute("變量名稱",變量內(nèi)容)

變量內(nèi)容可為字符串或者其他對象類型,接著再來看看如何使用這個方法在session中設(shè)置變量數(shù)據(jù):

     <%
     session.setAttribute("id","編號");                //設(shè)置字符串
     session.setAttribute("expire",new Date(86400*10)); //設(shè)置日期
     session.setAttribute("level",new Integer(3));  //設(shè)置整數(shù)
     %>

上面的代碼在session中建立了3個變量數(shù)據(jù):id、expire與level,用戶在當(dāng)前瀏覽器中打開各個網(wǎng)頁都能訪問這些變量數(shù)據(jù),不過如果是打開了另一個瀏覽器窗口,或者用戶是其他聯(lián)機的用戶,將無法取得其中的內(nèi)容。

2. 返回session中的變量

在session中設(shè)置了變量數(shù)據(jù)后,在其他各個網(wǎng)頁中便可使用getValue讀取其中的內(nèi)容,此方法所返回的數(shù)據(jù)類型為對象(Object)類型,語法如下:

     session.getAttribute("變量名稱")

3. 返回所有session中的變量名稱

getValueNames()方法可以取出session中所有變量的名稱,其結(jié)果為一個枚舉類的實例。語法如下:

     session.getAttributeNames()

4. 清除session中的變量

removeValue()方法可以清除session中的變量數(shù)據(jù),語法如下:

     session. removeAttribute("變量名稱")

5. 結(jié)束session

對于已經(jīng)建立的session,可使用invalidate()方法將其結(jié)束,語法如下:

     session.invalidate()

本小節(jié)介紹了JSP存取session數(shù)據(jù)的方式,下面接著介紹一些session特性的設(shè)置與常用的方法。

4.5.5 其他session對象的常用方法

除了訪問session中數(shù)據(jù)的基本方法外,在session對象下還有一些很常用的方法,例如取得session標(biāo)識符串、設(shè)置或取得系統(tǒng)預(yù)設(shè)結(jié)束session的時間等,如表4-6所示。

表4-6 session對象的常用方法

4.5.6 session對象應(yīng)用實例

【例4-12】存取session對象數(shù)據(jù)。sessionInfo.jsp用來輸入用戶的信息,sessionData.jsp讀取輸入信息并設(shè)置session內(nèi)容變量,usingSession.jsp取得session變量。

sessionInfo.jsp的代碼如下:

     <%@ page contentType="text/html; charset=gb2312" %>
     <html>
     <body>
     <form method=post action=sessionData.jsp>
     <table>
     <tr><td>輸入用戶名:</td>
     <td><input type=text name=name></td>
     </tr>
     <tr><td>輸入性別:</td>
     <td><input type=text name=sex></td>
     </tr>
     <tr colspan=2><td><input type=submit value=提交></td></tr>
     </table>
     </body>
     </html>

sessionData.jsp的代碼如下:

     <%@ page language="java" contentType="text/html; charset=gb2312"%>
     <%
     request.setCharacterEncoding("gb2312");
     %>
     <html>
     <head>
     <title>設(shè)置 session 數(shù)據(jù)</title>
     </head>
     <body>
     <%
        String name = request.getParameter("name");
        String sex = request.getParameter("sex");       session.setAttribute("name", name);
        session.setAttribute("sex", sex);
     %>
     <a href="usingSession.jsp"> 顯示已設(shè)置的session 數(shù)據(jù)內(nèi)容 </a>
     </body>
     </html>

sessionInfo.jsp程序代碼中引用了session對象的setAttribute()方法,在session中存入2筆變量數(shù)據(jù):name和sex接下來顯示網(wǎng)頁usingSession.jsp的超級鏈接,其中包含取得此session數(shù)據(jù)內(nèi)容的程序代碼。

usingSession.jsp的代碼如下:

這個網(wǎng)頁主要是取得前一個網(wǎng)頁記錄在session中的數(shù)據(jù),然后在網(wǎng)頁中顯示出來,程序代碼取得session中的變量值,依序顯示了session中的變量名稱及其內(nèi)容。在這里不像以前那樣在頁面之間跳轉(zhuǎn)時參數(shù)要經(jīng)過傳遞才能正確顯示,此例采用session保存用戶的信息,非常方便。

當(dāng)用戶單擊sessionData.jsp網(wǎng)頁超級鏈接時,由于均屬于同一個session,因此usingSession.jsp網(wǎng)頁就取得了sessionData.jsp網(wǎng)頁所設(shè)置的session數(shù)據(jù)內(nèi)容,如圖4-21所示。

圖4-21 設(shè)置并獲取session數(shù)據(jù)

現(xiàn)在重新打開一個新的瀏覽器窗口,然后直接輸入usingSession.jsp網(wǎng)頁的網(wǎng)址進行瀏覽,由于這是一個全新的session,而且沒有經(jīng)過第一個網(wǎng)頁的設(shè)置,因此這個session并沒有包含任何數(shù)據(jù)內(nèi)容,如圖4-22所示。

圖4-22 直接查看usingSession.jsp的運行結(jié)果

注意

session.getValue()方法所返回的數(shù)據(jù)類型為對象(Object)類型,可以根據(jù)程序的需要轉(zhuǎn)換為其他數(shù)據(jù)類型。

【例4-13】引用session對象方法,顯示session對象中部分屬性值。此例中包含了兩個程序sessionMethod.jsp和sessionMethodInfo.jsp。使用表4-6中的方法來取得與session有關(guān)的信息。其中,isNew()方法會判斷session是否為新建的,并返回布爾值true或false。新建session的意義是指程序調(diào)用session對象在服務(wù)器端建立session,而尚未將此session的信息記錄到客戶端的Cookie中。

sessionMethod.jsp的代碼如下:

在瀏覽器中打開http://localhost:8080/ch04/session/sessionMethod.jsp,則返回session為新建的信息true,如圖4-23所示。

圖4-23 sessionMethod.jsp的運行結(jié)果

sessionMethodInfo.jsp的代碼如下:

當(dāng)通過超級鏈接鏈接到sessionMethodInfo.jsp時,isNew()方法返回false,表示這是一個已經(jīng)存在的session。除此之外,代表session身份的標(biāo)識符串也相同,表示這兩個頁面是同一個session,如圖4-24所示。session1對象user1的取值為null,是由于在sessionMethod.jsp頁面中采用了session.removeAttribute("user1");刪除了與user1相關(guān)聯(lián)的屬性,而user2的值不變。

圖4-24 sessionMethodInfo.jsp的運行結(jié)果

如果把session.removeAttribute("user1");換成session.invalidate();,則跳轉(zhuǎn)到sessionMethodInfo.jsp頁面時會產(chǎn)生一個新的session對象,如圖4-25所示。和前面兩個圖比較,除了新建session為true之外,標(biāo)識符串也不相同,session對象的value都為null,表示這是一個全新的session。

圖4-25 結(jié)束session后sessionMethodInfo.jsp的運行結(jié)果

關(guān)閉瀏覽器,然后將其重新打開,查看sessionMethod.jsp,也會產(chǎn)生一個全新的session,如圖4-26所示。

圖4-26 重新打開瀏覽器獲取新session數(shù)據(jù)

【例4-14】創(chuàng)建sessionCount.jsp頁面,統(tǒng)計訪問站點的用戶數(shù)目。

sessionCount.jsp的代碼如下:

程序運行結(jié)果如圖4-27所示。由于采用if(session.isNew())來判斷是否是一個新的用戶,所以在每個頁面刷新時計數(shù)器并不會增加,只有開啟一個新的瀏覽器窗口才會計數(shù)。

圖4-27 sessionCount.jsp統(tǒng)計訪問站點的用戶數(shù)

另外需要注意的是,如果在執(zhí)行本程序時不是新開啟一個瀏覽器,會出現(xiàn)如圖4-28所示的界面,顯示計數(shù)器為null。這是由于if(session.isNew())判斷此時不是一個新的session對象,所以并沒有將Num變量值存入session。通過<%=session.getAttribute("Num")%>讀取session對象的值是null。

圖4-28 session計數(shù)器為null

主站蜘蛛池模板: 如东县| 青铜峡市| 宁南县| 会昌县| 沾益县| 玛多县| 汾阳市| 五河县| 龙山县| 皋兰县| 鲁甸县| 错那县| 那曲县| 德昌县| 彭州市| 平潭县| 栾川县| 龙游县| 北票市| 浙江省| 洪江市| 福州市| 河北省| 磐石市| 区。| 黔西县| 临泉县| 河东区| 西贡区| 桐梓县| 来安县| 大荔县| 呼和浩特市| 鲜城| 渝中区| 高密市| 简阳市| 泗阳县| 镇远县| 九龙城区| 永福县|