JSP Session會話
HTTP是一種“無狀態”協議,這意味著每一個客戶端檢索網頁,客戶端打開一個單獨的連接到Web服務器,服務器會自動不保留以前的客戶端請求的任何記錄的時間。
還是有以下三種方式來維護Web客戶端和Web服務器之間的會話:
Cookies:
一個網絡服務器可以分配一個唯一的會話ID作為一個cookie給每個Web客戶端和從客戶端就可以使用接收到的cookie確認後續請求。
這可能不是一個有效的方法,因為很多時候瀏覽器不支持Cookie,所以我不建議使用這個程序來維護會話。
隱藏表單域:
Web服務器可以與一個唯一的會話ID發送一個隱藏的HTML表單字段,如下所示:
<input type="hidden" name="sessionid" value="12345">
此項目意味著,當表單被提交時,指定名稱和值將自動包含在GET或POST數據。當Web瀏覽器發送請求回每一次,那麼session_id的值可以用來保持不同的網頁瀏覽器的跟蹤。
這可能是保持會話的軌道,但點擊常規(<A HREF...>)超文本鏈接不會導致表單提交,因此隱藏的表單字段也不能支持一般的會話跟蹤的有效途徑。
URL重寫:
您可以附加上每一個標識會話在URL末尾,一些額外的數據,並且服務器可以是會話標識符與已經存儲的有關會話數據關聯起來。
例如,http://gitbook.net/file.html;sessionid=12345,會話標識符作為附加的sessionid=12345可以在web服務器進行訪問,以確定客戶端。
URL重寫是一種更好的方式來維持會話和工程瀏覽器時,他們不支持Cookie,但是這裡的缺點是,你會動態生成每個URL分配一個會話ID,但網頁是簡單的靜態HTML頁麵。
session 對象:
除了上麵提到的三種方式,JSP利用所提供的servlet HttpSession接口提供了一個方法來識彆跨多個頁麵請求的用戶或瀏覽到一個網站,並存儲有關用戶的信息。
默認情況下,JSP中有會話跟蹤,並啟用了新的HttpSession對象被自動實例化每一個新的客戶端。禁用會話跟蹤需要明確的page指令會話屬性設置為false,如下所示將其關閉:
<%@ page session="false" %>
JSP引擎公開HttpSession對象的JSP提交通過隱式會話對象。由於會話對象已經提供給JSP,程序可以立即開始無需任何初始化或getSession()存儲和檢索的對象數據。
這裡是可通過會話對象的重要方法概要:
S.N. | 方法 & 描述 |
---|---|
1 |
public Object getAttribute(String name) This method returns the object bound with the specified name in this session, or null if no object is bound under the name. |
2 |
public Enumeration getAttributeNames() This method returns an Enumeration of String objects containing the names of all the objects bound to this session. |
3 |
public long getCreationTime() This method returns the time when this session was created, measured in milliseconds since midnight January 1, 1970 GMT. |
4 |
public String getId() This method returns a string containing the unique identifier assigned to this session. |
5 |
public long getLastAccessedTime() This method returns the last time the client sent a request associated with this session, as the number of milliseconds since midnight January 1, 1970 GMT. |
6 |
public int getMaxInactiveInterval() This method returns the maximum time interval, in seconds, that the servlet container will keep this session open between client accesses. |
7 |
public void invalidate() This method invalidates this session and unbinds any objects bound to it. |
8 |
public boolean isNew( This method returns true if the client does not yet know about the session or if the client chooses not to join the session. |
9 |
public void removeAttribute(String name) This method removes the object bound with the specified name from this session. |
10 |
public void setAttribute(String name, Object value) This method binds an object to this session, using the name specified. |
11 |
public void setMaxInactiveInterval(int interval) This method specifies the time, in seconds, between client requests before the servlet container will invalidate this session. |
Session 跟蹤例子:
這個例子說明如何使用HttpSession對象,找出創建時間和最後訪問時間為一個會話。我們將與請求,如果一個不存在一個新的會話相關聯。
<%@ page import="java.io.*,java.util.*" %> <% // Get session creation time. Date createTime = new Date(session.getCreationTime()); // Get last access time of this web page. 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 web page. 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); %> <html> <head> <title>Session Tracking</title> </head> <body> <center> <h1>Session Tracking</h1> </center> <table border="1" align="center"> <tr bgcolor="#949494"> <th>Session info</th> <th>Value</th> </tr> <tr> <td>id</td> <td><% out.print( session.getId()); %></td> </tr> <tr> <td>Creation Time</td> <td><% out.print(createTime); %></td> </tr> <tr> <td>Time of Last Access</td> <td><% out.print(lastAccessTime); %></td> </tr> <tr> <td>User ID</td> <td><% out.print(userID); %></td> </tr> <tr> <td>Number of visits</td> <td><% out.print(visitCount); %></td> </tr> </table> </body> </html>
現在把上麵的代碼在main.jsp,並嘗試訪問http://localhost:8080/main.jsp。當您第一次運行,它會顯示以下結果:
Welcome to my website
Session Infomation
Session info | value |
---|---|
id | 0AE3EC93FF44E3C525B4351B77ABB2D5 |
Creation Time | Tue Jun 08 17:26:40 GMT+04:00 2010 |
Time of Last Access | Tue Jun 08 17:26:40 GMT+04:00 2010 |
User ID | ABCD |
Number of visits | 0 |
現在嘗試第二次運行同一個JSP,它會顯示以下結果。
Welcome Back to my website
Session Infomation
info type | value |
---|---|
id | 0AE3EC93FF44E3C525B4351B77ABB2D5 |
Creation Time | Tue Jun 08 17:26:40 GMT+04:00 2010 |
Time of Last Access | Tue Jun 08 17:26:40 GMT+04:00 2010 |
User ID | ABCD |
Number of visits | 1 |
刪除會話數據:
當你與一個用戶的會話數據完成後,您有幾種選擇:
-
刪除一個特定的屬性:您可以調用public void removeAttribute(String name) 方法來刪除與特定的鍵關聯的值。
-
刪除整個會話:您可以調用public void invalidate() 方法放棄整個會話。
-
設置會話超時:您可以調用 public void setMaxInactiveInterval(int interval) 方法來單獨設置超時會話。
-
注銷用戶:支持Servlet2.4服務器,你可以調用注銷登錄客戶端出來的Web服務器和無效屬於所有用戶的所有會話。
-
web.xml中配置: 如果您使用的是Tomcat,除了上麵提到的方法,您可以配置會話超時在web.xml文件中,如下所示。
<session-config> <session-timeout>15</session-timeout> </session-config>
超時表示為分鐘,並覆蓋默認的超時時間是在Tomcat中為30分鐘。
在一個servlet 的 getMaxInactiveInterval()方法返回以秒為單位的會話超時時間。所以,如果你的會話配置在web.xml中為15分鐘,那麼getMaxInactiveInterval()返回900。