JSP會話Session跟蹤

在本章中,我們將討論JSP中的會話跟蹤。 HTTP是一種「無狀態」協議,這意味着每次客戶端檢索一個Web頁面時,客戶機打開與Web服務器的單獨連接,並且服務器自動不保留先前客戶端請求的任何記錄。

維護Web客戶端與服務器之間的會話

現在來討論幾個用來維護Web客戶機和Web服務器之間會話的方式 -

1.Cookies

網絡服務器可以將唯一的會話ID作爲cookie分配給每個Web客戶端,併爲客戶端提供後續請求,並使用接收到的cookie進行識別。

這可能不是有效的方式,因爲瀏覽器有時不支持cookie。不建議使用此過程來維護會話。

2.隱藏表單字段

Web服務器可以發送隱藏的HTML表單域以及唯一的會話ID,如下所示:

<input type = "hidden" name = "sessionid" value = "123456">

當提交表單時,指定的名稱和值將自動包含在GETPOST數據中。 每次Web瀏覽器發送請求時,session_id值都可以用於跟蹤不同的Web瀏覽器。

這可以是跟蹤會話的有效方法,但點擊常規(<a href="...">)超文本鏈接不會產生表單提交,因此隱藏表單字段也不能支持常規會話跟蹤。

3.網址重寫

可以在每個網址的末尾附加一些額外的數據。該數據標識會話; 服務器可以將該會話標識符與其關於該會話存儲的數據相關聯。

例如,使用URL:http://www.yiibai.com/file.html;sessionid=123456789,會話標識符作爲sessionid=123456789附加,可以在Web服務器上訪問以識別客戶端。

URL重寫是一種更好的方法來維護會話,並且在瀏覽器不支持cookie時可以使用它們。 這裏的缺點是,必須動態生成每個URL來分配會話ID,而頁面是一個簡單的靜態HTML頁面。

4.session對象

除了上述選項之外,JSP還使用了提供HttpSession接口的servlet。該接口提供了一種識別用戶的方法。

  • 一個頁請求或
  • 訪問網站或
  • 存儲有關該用戶的信息

默認情況下,JSP啓用會話跟蹤,併爲每個新客戶端自動實例化一個新的HttpSession對象。 禁用會話跟蹤需要通過將頁面指令會話屬性設置爲false來明確地將其關閉,如下所示:

<%@ page session = "false" %>

JSP引擎通過隱式會話對象將HttpSession對象公開給JSP程序員。由於會話對象已經提供給JSP程序員,程序員可以立即開始從對象中存儲和檢索數據,而無需任何初始化或getSession()

以下是session對象提供的重要方法列表 -

編號

語法

描述

1

public Object getAttribute(String name)

此方法返回在此會話中用指定名稱綁定的對象,如果在名稱下沒有綁定對象,則返回null

2

public Enumeration getAttributeNames()

此方法返回一個包含綁定到此會話的所有對象的名稱的String對象枚舉。

3

public long getCreationTime()

此方法返回創建此會話的時間,以1970年1月1日GMT格林尼治時間以來的毫秒爲單位。

4

public String getId()

此方法返回一個包含分配給此會話的唯一標識符的字符串。

5

public long getLastAccessedTime()

此方法返回客戶端上次發送與此會話相關聯的請求的時間,爲1970年1月1日GMT以來的毫秒數。

6

public int getMaxInactiveInterval()

此方法返回servlet容器在客戶端訪問之間保持此會話的最長時間間隔(以秒爲單位)。

7

public void invalidate()

此方法使該會話無效,並取消綁定綁定到該對象的任何對象。

8

public boolean isNew()

如果客戶端還不知道會話或者客戶端選擇不加入會話,則此方法返回true

9

public void removeAttribute(String name)

此方法從此會話中刪除與指定名稱綁定的對象。

10

public void setAttribute(String name, Object value)

此方法使用指定的名稱將對象綁定到此會話。

11

public void setMaxInactiveInterval(int interval)

此方法指定在servlet容器將使此會話無效之前,客戶端請求之間的時間(以秒爲單位)。

會話跟蹤示例

此示例介紹如何使用HttpSession對象來查找會話的創建時間和最後訪問的時間。如果尚不存在,會將新建會話與請求相關聯。

打開Eclipse,創建一個動態Web項目:SessionTracking, 其目錄結構如下所示 -

JSP會話Session跟蹤

創建一個JSP文件:index.jsp,如下代碼 -

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="java.io.*,java.util.*"%>
<%
    // Get session creation time.
    Date createTime = new Date(session.getCreationTime());

    // Get last access time of this Webpage.
    Date lastAccessTime = new Date(session.getLastAccessedTime());

    String title = "Welcome Back to my website";
    Integer visitCount = new Integer(0);
    String visitCountKey = new String("visitCount");
    String userIDKey = new String("userID");
    String userID = new String("ABCD");

    // Check if this is new comer on your Webpage.
    if (session.isNew()) {
        title = "Welcome to my website";
        session.setAttribute(userIDKey, userID);
        session.setAttribute(visitCountKey, visitCount);
    }
    visitCount = (Integer) session.getAttribute(visitCountKey);
    visitCount = visitCount + 1;
    userID = (String) session.getAttribute(userIDKey);
    session.setAttribute(visitCountKey, visitCount);
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Session會話跟蹤示例</title>
</head>
<body>
    <div style="margin: auto; width: 80%;">
        <center>
            <h2>
                Session會話跟蹤示例
                </h1>
        </center>

        <table border="1" align="center">
            <tr bgcolor="#949494">
                <th>會話信息</th>
                <th>值</th>
            </tr>
            <tr>
                <td>id</td>
                <td>
                    <%
                        out.print(session.getId());
                    %>
                </td>
            </tr>
            <tr>
                <td>創建時間</td>
                <td>
                    <%
                        out.print(createTime);
                    %>
                </td>
            </tr>
            <tr>
                <td>最近一次訪問時間</td>
                <td>
                    <%
                        out.print(lastAccessTime);
                    %>
                </td>
            </tr>
            <tr>
                <td>用戶ID</td>
                <td>
                    <%
                        out.print(userID);
                    %>
                </td>
            </tr>
            <tr>
                <td>訪問次數</td>
                <td>
                    <%
                        out.print(visitCount);
                    %>
                </td>
            </tr>
        </table>
    </div>
</body>
</html>

編寫完成上面代碼後,部署項目然後運行,打開瀏覽器嘗試訪問:http://localhost:8080/SessionTracking/ 。將看到以下結果 -

JSP會話Session跟蹤

現在嘗試再次運行(刷新)相同的JSP頁面,可以看到訪問次數更新爲2,如下圖所示 -

JSP會話Session跟蹤

刪除會話數據

完成用戶的會話數據後,有幾個方式用來刪除會話信息 -

  • 刪除一個指定的屬性 - 可以調用public void removeAttribute(String name)方法來刪除與特定鍵相關聯的值。

  • 刪除整個會話信息 - 可以調用public void invalidate()方法來刪除(丟棄)整個會話信息。

  • 設置會話超時 - 可以調用public void setMaxInactiveInterval(int interval)方法來單獨設置會話的超時。

  • 註銷登錄用戶 - 支持servlets 2.4的服務器,可以調用註銷將客戶端記錄在Web服務器之外,並使屬於用戶的所有會話失效。

  • web.xml配置 - 如果使用的是Tomcat,除了上述方法外,還可以在web.xml文件中配置會話超時,如下所示-

    <session-config>
     <session-timeout>15</session-timeout>
    </session-config>

    <session-timeout>指定超時表示的時間單位爲分鐘,上面配置示例將覆蓋Tomcat中30分鐘的默認超時。

servlet中的getMaxInactiveInterval()方法以秒爲單位返回該會話的超時時間。 因此,如果會話在web.xml中配置了15分鐘,那麼getMaxInactiveInterval()方法將返回900秒。