在本章中,我們將討論JSP中的對談跟蹤。 HTTP是一種「無狀態」協定,這意味著每次用戶端檢索一個Web頁面時,客戶機開啟與Web伺服器的單獨連線,並且伺服器自動不保留先前用戶端請求的任何記錄。
現在來討論幾個用來維護Web客戶機和Web伺服器之間對談的方式 -
1.Cookies
網路伺服器可以將唯一的對談ID作為cookie分配給每個Web用戶端,並為用戶端提供後續請求,並使用接收到的cookie進行識別。
這可能不是有效的方式,因為瀏覽器有時不支援cookie。不建議使用此過程來維護對談。
2.隱藏表單欄位
Web伺服器可以傳送隱藏的HTML表單域以及唯一的對談ID,如下所示:
<input type = "hidden" name = "sessionid" value = "123456">
當提交表單時,指定的名稱和值將自動包含在GET
或POST
資料中。 每次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)
方法來單獨設定對談的超時。web.xml
檔案中組態對談超時,如下所示-<session-config>
<session-timeout>15</session-timeout>
</session-config>
<session-timeout>
指定超時表示的時間單位為分鐘,上面組態範例將覆蓋Tomcat中30
分鐘的預設超時。servlet中的getMaxInactiveInterval()
方法以秒為單位返回該對談的超時時間。 因此,如果對談在web.xml
中組態了15
分鐘,那麼getMaxInactiveInterval()
方法將返回900
秒。