會話跟蹤是一種靈活、輕便的機(jī)制,它使在頁面上的狀態(tài)編程變?yōu)榭赡堋TTP是一種無狀態(tài)協(xié)議,每當(dāng)用戶發(fā)出請求時,服務(wù)器就做出響應(yīng),客戶端與服務(wù)器之間的聯(lián)系是離散的、非連續(xù)的。當(dāng)用戶在同一網(wǎng)站的多個頁面之間轉(zhuǎn)換時,根本無法知道是否是同一個客戶,會話跟蹤就可以解決這個問題。當(dāng)一個客戶在多個頁面間切換時,服務(wù)器會保存該用戶的信息。
在服務(wù)器上,通過為在站點(diǎn)上的用戶創(chuàng)建一個會話對象保存該用戶的信息。當(dāng)用戶第一次訪問站點(diǎn)時,分配給用戶一個會話對象和一個單獨(dú)的會話ID,這個ID是惟一的。在接下來的請求中,會話ID標(biāo)識了這個用戶,會話對象作為請求的一部分發(fā)送給Servlet,Servlet能從會話對象中讀取信息,或者為其添加信息。
在用戶閑置了一段時間后,這個會話對象就失效了,會話對象要被刪除,這段時間默認(rèn)是30分鐘,當(dāng)然可以在系統(tǒng)治理工具中設(shè)置這個時間。也可以通過手工操作使會話失效,調(diào)用session.invalidate( )方法能使會話對象立即失效,并刪除該對象所包含的數(shù)據(jù)及會話對象本身。
為了使應(yīng)用具有session功能,java Servlet技術(shù)提供了治理session的API和集中實(shí)現(xiàn)session的機(jī)制。Java.servlet.http.HttpSession就封裝了HTTP會話的全部功能,其主要的功能如下。
訪問Session
Session表現(xiàn)為HttpSession對象。調(diào)用request對象的getSession方法訪問session。這個方法返回當(dāng)前客戶端請求(request)所關(guān)聯(lián)的session,假如不存在,則為當(dāng)前請求(request)創(chuàng)建一個session。由于getSession方法可能會改變響應(yīng)(response)的頭信息,所以需要在獲得PRintWriter或ServletOutputStream之前被調(diào)用。
使屬性和Session相關(guān)聯(lián)
可以通過名稱使對象值屬性和一個session相關(guān)聯(lián)。例如把購物車作為屬性存儲在session中,在其他Servlet中可以通過session再獲得購物車。
// 得到用戶session和購物籃
HttpSession session = request.getSession();
ShoppingCart cart = (ShoppingCart)session.getAttribute("cart");
……
Session治理
由于沒有辦法知道HTTP客戶端是否不再需要session,因此每個session都關(guān)聯(lián)一個時間期限使它的資源可以被回收。通過session的setMaxInactiveInterval和getMaxInactiveInterval方法訪問超時時間。
為了確保session的有效、不超時,開發(fā)人員應(yīng)該在service方法中周期性地訪問session。當(dāng)客戶端完成一個(組)完整的交互過程后,可以使用invalidate()方法使服務(wù)器端的session無效,并清除session數(shù)據(jù)。
// 得到用戶session和購物籃
HttpSession session = request.getSession();
// 付款完成,使session無效
session.invalidate();
……
實(shí)例:會話跟蹤Servlet程序
下面就舉一個關(guān)于會話跟蹤的具體例子,見示例14-5。
【程序源代碼】
1 // ==================== Program Description ==========================
2 // 程序名稱:示例14-5 : SessionServlet.java
3 // 程序目的:編寫會話跟蹤的Servlet程序
4 // ==============================================================
5 package examples.servlets;
6
7 import java.io.*;
8 import java.util.Enumeration;
9 import javax.servlet.*;
10 import javax.servlet.http.*;
11
12 public class SessionServlet extends HttpServlet
13 {
14 public void doGet (HttpServletRequest req, HttpServletResponse res)
15 throws ServletException, IOException
16 {
17 HttpSession session = req.getSession(true);
18 res.setContentType("text/Html");
19 PrintWriter out = res.getWriter();
20 out.println("
新聞熱點(diǎn)
疑難解答