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

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頁面的運行結果

主站蜘蛛池模板: 天台县| 高淳县| 兴仁县| 玛曲县| 宁蒗| 万宁市| 广灵县| 东光县| 宝兴县| 晴隆县| 泸州市| 碌曲县| 靖远县| 双辽市| 章丘市| 宁陵县| 河源市| 二连浩特市| 金秀| 刚察县| 兴仁县| 舒兰市| 太保市| 彭州市| 游戏| 镇沅| 志丹县| 西峡县| 景宁| 孝昌县| 昌黎县| 广汉市| 凌源市| 綦江县| 兴化市| 轮台县| 保靖县| 株洲市| 新余市| 洛隆县| 辽中县|