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:https://www.tw511.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檔案: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頁面,可以看到存取次數更新為2,如下圖所示 -

刪除對談資料

完成使用者的對談資料後,有幾個方式用來刪除對談資訊 -

  • 刪除一個指定的屬性 - 可以呼叫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秒。