客戶與服務器之間的通信是通過 HTTP 協議完成的。HTTP 是一種無狀態的協議,當客戶向服務器發出請求,服務器接收請求并返回響應后,該連接就被關閉了。此時,服務器端不保留連接的有關信息,要想記住客戶的連接信息,可以使用 JSP 提供的 session 對象。
用戶登錄網站時,系統將為其生成一個獨一無二的 session 對象,用以記錄該用戶的個人信息。一旦用戶退出網站,那么,所對應的 session 對象將被注銷。session 對象可以綁定若干個用戶信息或者 JSP 對象,不同的 session 對象的同名變量是不會相互干擾的。
當用戶首次訪問服務器上的一個 JSP 頁面時,JSP 引擎便產生一個 session 對象,同時分配一個 String 類型的 ID 號,JSP 引擎同時將這個 ID 號發送到客戶端,存放在 Cookie 中,這樣,session 對象和客戶端之間就建立了一一對應的關系。
當用戶再次訪問該服務器的其他頁面時,不再分配給用戶新的 session 對象,直到用戶關閉瀏覽器,或者在一定時間(系統默認在 30 分鐘內,但可在編寫程序時,修改這個時間限定值或者顯式地結束一個會話)客戶端不向服務器發出應答請求,服務器端就會取消該用戶的 session 對象,與用戶的會話對應關系消失。當用戶重新打開瀏覽器,再次連接到該服務器時,服務器為該用戶再創建一個新的 session 對象。
session 對象保存的是每個用戶專用的私有信息,可以是與客戶端有關的,也可以是一般信息,可以根據需要設定相應的內容,并且所保存的信息在當前 session 屬性范圍內是共享的。表 1 列出了 session 對象的常用方法。
表1 session對象的常用方法
方法 |
說明 |
---|---|
Object getAttribute(String name) |
獲取指定名字的屬性 |
Enumeration getAttributeName() |
獲取 session 中全部屬性的名字,一個枚舉 |
long getCreationTime() |
返回 session 的創建時間,單位:毫秒 |
public String getld() |
返回創建 session 時 JSP 引擎為它設置的唯一 ID 號 |
long getLastAccessedTime() |
返回此 session 中客戶端最近一次請求的時間。由 1970-01-01算起,單位是毫秒。使用這個方法,可以判斷某個用戶在站點上一共停留了多長時間 |
int getMaxInactiveInterval() |
返回兩次請求間隔多長時間 session 被銷毀(單位:秒) |
void setMaxlnactivelnterval(int interval) |
設置兩次請求間隔多長時間 session 被銷毀(單位:秒) |
void invalidate() |
銷毀 session 對象 |
boolean isNew() |
判斷請求是否會產生新的 session 對象 |
void removeAttxibute(String name) |
刪除指定名字的屬性 |
void setAttribute(String name,String value) |
設定指定名字的屬性值 |
使用 session 對象在不同的 JSP 文件(整個客戶會話過程,即 session scope)中保存屬性信息,比如用戶名、驗證信息等,最為典型的應用是實現網上商店購物車的信息存儲。下面重點介紹 session 對象的應用。
JSP 頁面可以將任何對象作為屬性來保存。使用 setAttribute() 方法設置指定名稱的屬性,并將其存儲在 session 對象中,使用 getAttribute() 方法獲取與指定名字 name 相聯系的屬性。語法格式如下:
session.setAttribute(String name,String value); //參數name為屬性名稱,value為屬性值
session.getAttribute(String name); //參數 name 為屬性名稱
例1:用 session 對象創建及獲取會話屬性。通過 session 對象的 setAttribute() 方法,將數據保存在 session 對象中,并通過 getAttribute() 方法取得數據的值,代碼如下:
<!--3-13.jsp-->
<%@ page language="java" import="java.util.*" pageEncoding="utf-8" %>
<html>
<head>
<title>
session 對象創建及獲取客戶會話屬性
</title>
</head>
<body>
session 的創建時間:<%=new Date(session.getCreationTime()).toLocaleString() %> <br>
session 的 ID 號:<%=session.getId() %> <br> <hr>
當前時間:<%=new Date().toLocaleString( ) %> <br>
該 session 是新創建的嗎?:<%=session.isNew()?"是":"否" %> <br> <hr>
當前時間:<%=new Date().toLocaleString( ) %> <br>
<% session.setAttribute("info","您好,我們正在使用 session 對象傳遞數據!"); %>
已向 Session 中保存數據,請單擊下面的鏈接將頁面重定向到 4-11-1.jsp
<a href="Test.jsp"> 請按這里</a>
</body>
</html>
3-13-1.jsp 與 3-13.jsp 的代碼基本相同,不同的是獲取 session 對象中的屬性值的方法,重要代碼如下:
獲取 session 中的數據為:<br>
<%=session.setAttribute("info")%>
運行結果如圖 1(a) 所示,單擊超鏈接“請按這里”,進入如圖 1(b) 所示的頁面。
a)頁面 3-13.jsp 的運行結果
b)頁面 3-13-1.jsp 的運行結果
圖1 用session對象創建及獲取會話屬性
JSP 頁面可以將任何已經保存的對象部分或者全部移除。使用 removeAttribute() 方法,將指定名稱的對象移除,也就是說,從這個會話刪除與指定名稱綁定的對象。使用 invalidate() 方法,可以將會話中的全部內容刪除。語法格式如下:
session.removeAttribute(String name); //參數name為session對象的屬性名,代表要移除的對象名
session.invalidate(); //把保存的所有對象全部刪除
例2:用 session 對象從會話中移除指定的對象。繼續沿用例 1 中的 3-13.jsp 頁面,并且改造 3-13-1.jsp,代碼如下:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8" %>
<html>
<head>
<title>
session 對象創建及獲取客戶會話屬性
</title>
</head>
<body>
session 的創建時間:<%=new Date(session.getCreationTime()).toLocaleString() %> <br>
session 的 ID 號:<%=session.getId() %> <br> <hr>
當前時間:<%=new Date().toLocaleString( ) %> <br>
該 session 是新創建的嗎?:<%=session.isNew()?"是":"否" %> <br> <hr>
當前時間:<%=new Date().toLocaleString( ) %> <br>
移除 session 中的數據后:<br>
<%
session.removeAttribute("info");
if(session.getAttribute("info")==null)
{
out.println("session 對象 info 已經不存在");
}
else
{
out.println(session.getAttribute("info"));
}
%>
</body>
</html>
運行程序,單擊“請按這里”超鏈接后,將會顯示如圖 2 所示的頁面。
圖2 用session對象從會話中移除指定的對象
當某一客戶與 Web 應用程序之間處于非活動狀態時,并不以顯式的方式通知服務器,所以,在 Servlet 程序或 JSP 文件中,做超時設置是確保客戶會話終止的唯一方法。
Servlet 程序容器設置一個超時時長,當客戶非活動的時間超出時長的大小時,JSP 容器將使 session 對象無效,并撤銷所有屬性的綁定,這樣,就清除了客戶申請的資源,從而實現了會話生命周期的管理。
session 用于管理會話生命周期的方法有 getLastAccessedTime()、getMaxInactiveInterval() 和 setMaxInactiveInterval(int interval)。
例3:為 session 對象設置會話時限。首先輸出 session 對象默認的有效時間,然后設置為 5 分鐘,并輸出新設置的有效時間。代碼如下:
<%@ page language="java" pageEncoding="utf-8" %>
<html>
<head>
<title>
session 對象設置會話時限
</title>
</head>
<body>
session 對象默認的有效時間:<%=session.getMaxInactiveInterval()%>秒<br>
<%
session.setMaxInactiveInterval(60*5); //設置session的有效時間為5分鐘
%>
已經將 session 有效時間修改為:<%=session.getMaxInactiveInterval()%>秒<br>
</body>
</html>
運行結果如圖 3 所示。
圖3 session對象設置會話時限