- JSP應(yīng)用與開發(fā)技術(shù)(第3版)
- 馬建紅 李學(xué)相 韓穎 王瑞娟 張晗
- 2660字
- 2020-06-30 17:13:25
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
- The Complete Rust Programming Reference Guide
- Java語言程序設(shè)計
- Oracle Exadata性能優(yōu)化
- Oracle Database 12c Security Cookbook
- Scala謎題
- 自然語言處理Python進階
- Node.js全程實例
- 零基礎(chǔ)入門學(xué)習(xí)Python(第2版)
- Java編程的邏輯
- Scala Reactive Programming
- Programming Microsoft Dynamics? NAV 2015
- HTML5+CSS3+JavaScript 從入門到項目實踐(超值版)
- 從Excel到Python數(shù)據(jù)分析:Pandas、xlwings、openpyxl、Matplotlib的交互與應(yīng)用
- 程序員的成長課
- Using Yocto Project with BeagleBone Black