用Servlet控制會話
會話狀態的維持是開發Web應用所必須面對的問題,有多種方法可以來解決這個問題,如使用Cookies,hidden類型的表單域,或直接把狀態資訊加到URL中等,還有Servlet本身提供了一個HttpSession介面來支援會話狀態的維持,在這裡我們主要介紹基於這個介面的會話狀態的管理。
Session的發明是為了填補HTTP協定的限制。請注意HTTP協定是如何運作的--使用者發出請求,伺服器作出回應,這種使用者端和伺服器端的聯繫就是離散的,非連續的。 HTTP協定不能提供允許伺服器追蹤使用者請求的功能。在伺服器端完成響應用戶的請求之後,伺服器無法繼續與該瀏覽器繼續保持連線。從伺服器這端來看,每個請求都是獨立的,因此HTTP協定被視為無狀態協議,當使用者在多個主頁間切換時,伺服器無法知道他的身分。 Session的出現就是為了彌補這個限制。利用Session,您就可以當一個使用者在多個主頁間切換的時候也能保存他的資訊。這樣很多以前根本無法去做的事情就變得簡單多了。
在訪客從到達某個特定的主頁到離開為止的那段時間,每個訪客都會單獨獲得一個Session。 Java Servlet定義了一個HttpSession接口,實現的Session的功能,在Servlet中使用Session的過程如下: # (1) 使用HttpServletRequest的getSession方法得到當前存在的session,如果當前存在的session,如果當前存在的session session,則建立一個新的session,也可以使用方法getSession(true)
(2) 寫入session變數。可以使用方法HttpSession.setAttribute(name,value)來儲存一個資訊到Session。也可以使用HttpSession.putValue(name,value),但這個方法已經過時了。
(3) 讀Session變數。可以使用方法HttpSession.getAttribute(name)來讀取Session中的一個變數值,如果name是沒有定義的變量,那麼回傳的是null。要注意的是,從getAttribute讀出的變數型別是Object,必須使用強制型別轉換,例如: String uid = (String) session.getAttribute("uid"); 也可以使用Htt (name),但是這個方法也已經過時了。
(4) 關閉session,當時用完session後,可以使用session.invalidate()方法關閉session。但這並不是嚴格要求的。因為,Servlet引擎在一段時間之後,自動關閉seesion。
下面舉一個簡單的例子說明session的使用 // SessionExample.java import java.io.*; import java.util.*;##.io.*; import java.util.*; . servlet.*; import javax.servlet.http.*; //導入必要的軟體包 public class SessionExample extends HttpServlet ppublic v. ponse response ) throws IOException, ServletException //實作doGet方法 { 集); Writer out = response.getWriter(); //得到輸出Writer HttpSession session = request.getSession(true); //得到session物件
//列印HTML標記 out.println(""); out.println(""); out.println(""); out.println(""); out.println(""); .println(""); out.println(""); out.println("");## out.println("");## ate created = new Date(session.getCreationTime()); ///ses 所建立的時間點 ///ses 所建立的時間##""""""""""""n, 完成的程式碼。」00,000) 得到的時間#dID 完成物件。 )); //得到最後訪問該session物件的時間 out.println("ID " session.getId() " "); / out.println("Created: " created " "); //列印session建立時間 out.println("Last Accessed: " accessed " ");
session.setAttribute("UID","12345678"); 2 245 245 38 ## session.setAttribute("Name","Tom"); 在session中加入變數Name=Tom
Enumeration e = session.getAttributeNames(); 總變數中得到的舉名 比 while (e.hasMoreElements() ) { //遍歷每一個變數 String //首先得到名字 String ue = session. //由名字從session中得到值 out .println(name " = " value " "); //印出 } out.println(""); //HTML] # out.println(""); //HTML] 」標記 } } }
|