- Java Web從入門到精通(第3版)
- 明日科技
- 1629字
- 2020-06-29 17:34:00
6.4 session對象
session在網絡中被稱為會話。由于HTTP協議是一種無狀態協議,也就是當一個客戶向服務器發出請求,服務器接收請求,并返回響應后,該連接就結束了,而服務器并不保存相關的信息。為了彌補這一缺點,HTTP協議提供了session。通過session可以在應用程序的Web頁面間進行跳轉時,保存用戶的狀態,使整個用戶會話一直存在下去,直到關閉瀏覽器。但是,如果在一個會話中,客戶端長時間不向服務器發出請求,session對象就會自動消失。這個時間取決于服務器,例如,Tomcat服務器默認為30分鐘。不過這個時間可以通過編寫程序進行修改。
實際上,一次會話的過程也可以理解為一個打電話的過程。通話從拿起電話或手機撥號開始,一直到掛斷電話結束,在這個過程中,可以與對方聊很多話題,甚至重復的話題。一個會話也是這樣,可以重復訪問相同的Web頁。
6.4.1 創建及獲取客戶的會話
通過session對象可以存儲或讀取客戶相關的信息。例如,用戶名或購物信息等。這可以通過session對象的setAttribute()方法和getAttribute()方法實現。下面分別進行介紹。
setAttribute()方法
該方法用于將信息保存在session范圍內,其語法格式如下:
session.setAttribute(String name,Object obj)
參數說明:
name:用于指定作用域在session范圍內的變量名。
obj:保存在session范圍內的對象。
【例6.15】 將用戶名“綠草”保存到session范圍內的username變量中,可以使用下面的代碼:
session.setAttribute("username","綠草");
getAttribute()方法
該方法用于獲取保存在session范圍內的信息,其語法格式如下:
getAtttibute(String name)
參數說明:
name:指定保存在session范圍內的關鍵字。
【例6.16】 讀取保存到session范圍內的username變量的值。示例代碼如下:
session.getAttribute("username");
說明
getAttribute()方法的返回值是Object類型,如果將獲取到的信息賦值給String類型的變量,則需要進行強制類型轉換或是調用其toString()方法,例如,下面的兩行代碼都是正確的。

6.4.2 從會話中移動指定的綁定對象
對于存儲在session會話中的對象,如果想將其從session會話中移除,可以使用session對象的removeAttribute()方法,該方法的語法格式如下:
removeAttribute(String name)
參數說明:
name:用于指定作用域在session范圍內的變量名。一定要保證該變量在session范圍內有效,否則將拋出異常。
【例6.17】 將保存在session會話中的username對象移除的代碼如下:
<% session.removeAttribute("username"); %>
6.4.3 銷毀session
雖然當客戶端長時間不向服務器發送請求后,session對象會自動消失,但對于某些實時統計在線人數的網站(例如聊天室),每次都等session過期后,才能統計出準確的人數,這是遠遠不夠的。所以還需要手動銷毀session。通過session對象的invalidate()方法可以銷毀session,其語法格式如下:
session.invalidate();
session對象被銷毀后,將不可以再使用該session對象。如果在session被銷毀后,再調用session對象的任何方法,都將報出Session already invalidated異常。
6.4.4 會話超時的管理
在應用session對象時應該注意session的生命周期。一般來說,session的生命周期在20~30分鐘。當用戶首次訪問時將產生一個新的會話,以后服務器就可以記住這個會話狀態,當會話生命周期超時時,或者服務器端強制使會話失效時,這個session就不能使用了。在開發程序時應該考慮到用戶訪問網站時可能發生的各種情況,例如用戶登錄網站后在session的有效期外進行相應操作,用戶會看到一個錯誤頁面。這樣的現象是不允許發生的。為了避免這種情況的發生,在開發系統時應該對session的有效性進行判斷。
在session對象中提供了設置會話生命周期的方法,分別介紹如下。
getLastAccessedTime():返回客戶端最后一次與會話相關聯的請求時間。
getMaxInactiveInterval():以秒為單位返回一個會話內兩個請求最大時間間隔。
setMaxInactiveInterval():以秒為單位設置session的有效時間。
例如,通過setMaxInactiveInterval()方法設置session的有效期為10000秒,超出這個范圍session將失效。
session.setMaxInactiveInterval(10000);
6.4.5 session對象的應用
session是較常用的內置對象之一,與request對象相比其作用范圍更大。下面通過實例介紹session對象的應用。
【例6.18】 在index.jsp頁面中,提供用戶輸入用戶名文本框;在session.jsp頁面中,將用戶輸入的用戶名保存在session對象中,用戶在該頁面中可以添加最喜歡去的地方;在result.jsp頁面中,顯示用戶輸入的用戶名與最想去的地方。(實例位置:資源包\TM\sl\6\7)
(1)index.jsp頁面的代碼如下:

該頁面運行結果如圖6.8所示。

圖6.8 index.jsp頁面運行結果
(2)在session.jsp頁面中,將用戶在index.jsp頁面中輸入的用戶名保存在session對象中,并為用戶提供用于添加最想去的地址的文本框。代碼如下:

session.jsp頁面運行結果如圖6.9所示。

圖6.9 session.jsp頁面運行結果
(3)在result.jsp頁面中,實現顯示用戶輸入的用戶名與最喜歡去的地方。代碼如下:

result.jsp頁面的運行結果如圖6.10所示。

圖6.10 result.jsp頁面的運行結果
- Mastering Concurrency Programming with Java 8
- GAE編程指南
- Learning Bayesian Models with R
- FreeSWITCH 1.6 Cookbook
- C語言程序設計案例式教程
- Learn WebAssembly
- Mastering Ext JS
- Unity Game Development Scripting
- 從零開始學C語言
- OpenStack Networking Essentials
- Scala編程(第5版)
- SwiftUI極簡開發
- Learning Kotlin by building Android Applications
- Visual Basic程序設計實驗指導及考試指南
- Google Adsense優化實戰