JSP Session

HTTP是無(wú)狀態(tài)協(xié)議,這意味著每次客戶端檢索網(wǎng)頁(yè)時(shí),都要單獨(dú)打開(kāi)一個(gè)服務(wù)器連接,因此服務(wù)器不會(huì)記錄下先前客戶端請(qǐng)求的任何信息。

有三種方法來(lái)維持客戶端與服務(wù)器的會(huì)話:

    Cookies

網(wǎng)絡(luò)服務(wù)器可以指定一個(gè)唯一的session ID作為cookie來(lái)代表每個(gè)客戶端,用來(lái)識(shí)別這個(gè)客戶端接下來(lái)的請(qǐng)求。

這可能不是一種有效的方式,因?yàn)楹芏鄷r(shí)候?yàn)g覽器并不一定支持cookie,所以我們不建議使用這種方法來(lái)維持會(huì)話。

    隱藏表單域

一個(gè)網(wǎng)絡(luò)服務(wù)器可以發(fā)送一個(gè)隱藏的HTML表單域和一個(gè)唯一的session ID,就像下面這樣:

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

這個(gè)條目意味著,當(dāng)表單被提交時(shí),指定的名稱和值將會(huì)自動(dòng)包含在GET或POST數(shù)據(jù)中。每當(dāng)瀏覽器發(fā)送一個(gè)請(qǐng)求,session_id的值就可以用來(lái)保存不同瀏覽器的軌跡。

這種方式可能是一種有效的方式,但點(diǎn)擊<A HREF>標(biāo)簽中的超鏈接時(shí)不會(huì)產(chǎn)生表單提交事件,因此隱藏表單域也不支持通用會(huì)話跟蹤。

    重寫(xiě)URL

您可以在每個(gè)URL后面添加一些額外的數(shù)據(jù)來(lái)區(qū)分會(huì)話,服務(wù)器能夠根據(jù)這些數(shù)據(jù)來(lái)關(guān)聯(lián)session標(biāo)識(shí)符。

舉例來(lái)說(shuō),http://(cainiaoplus.com)/file.htm;sessionid=12345, session標(biāo)識(shí)符為sessionid=12345,服務(wù)器可以用這個(gè)數(shù)據(jù)來(lái)識(shí)別客戶端。

相比而言,重寫(xiě)URL是更好的方式來(lái),就算瀏覽器不支持cookies也能工作,但缺點(diǎn)是您必須為每個(gè)URL動(dòng)態(tài)指定session ID,就算這是個(gè)簡(jiǎn)單的HTML頁(yè)面。

    session對(duì)象

除了以上幾種方法外,JSP利用servlet提供的HttpSession接口來(lái)識(shí)別一個(gè)用戶,存儲(chǔ)這個(gè)用戶的所有訪問(wèn)信息。

默認(rèn)情況下,JSP允許會(huì)話跟蹤,一個(gè)新的HttpSession對(duì)象將會(huì)自動(dòng)地為新的客戶端示例化。禁止會(huì)話跟蹤需要顯式地關(guān)掉它,通過(guò)將page指令中session屬性值設(shè)為false來(lái)實(shí)現(xiàn),就像下面這樣:

<%@ page session="false" %>

JSP引擎將隱含的session對(duì)象暴露給開(kāi)發(fā)者。由于提供了session對(duì)象,開(kāi)發(fā)者就可以方便地存儲(chǔ)或檢索數(shù)據(jù)。

下表列出了session對(duì)象的一些重要方法:

S.N.方法 & 描述
                1public Object getAttribute(String name) 返回session對(duì)象中與指定名稱綁定的對(duì)象,如果不存在則返回null
                2public Enumeration getAttributeNames() 返回session對(duì)象中所有的對(duì)象名稱
                3public long getCreationTime() 返回session對(duì)象被創(chuàng)建的時(shí)間, 以毫秒為單位,從1970年1月1號(hào)凌晨開(kāi)始算起
                4public String getId() 返回session對(duì)象的ID
                5public long getLastAccessedTime() 返回客戶端最后訪問(wèn)的時(shí)間,以毫秒為單位,從1970年1月1號(hào)凌晨開(kāi)始算起
                6public int getMaxInactiveInterval() 返回最大時(shí)間間隔,以秒為單位,servlet 容器將會(huì)在這段時(shí)間內(nèi)保持會(huì)話打開(kāi)
                7public void invalidate() 將session無(wú)效化,解綁任何與該session綁定的對(duì)象
                8public boolean isNew() 返回是否為一個(gè)新的客戶端,或者客戶端是否拒絕加入session
                9public void removeAttribute(String name) 移除session中指定名稱的對(duì)象
                10public void setAttribute(String name, Object value)  使用指定的名稱和值來(lái)產(chǎn)生一個(gè)對(duì)象并綁定到session中
                11public void setMaxInactiveInterval(int interval) 用來(lái)指定時(shí)間,以秒為單位,servlet容器將會(huì)在這段時(shí)間內(nèi)保持會(huì)話有效

JSP Session應(yīng)用

這個(gè)實(shí)例描述了如何使用HttpSession對(duì)象來(lái)獲取創(chuàng)建時(shí)間和最后一次訪問(wèn)時(shí)間。我們將會(huì)為request對(duì)象關(guān)聯(lián)一個(gè)新的session對(duì)象,如果這個(gè)對(duì)象尚未存在的話。

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="java.io.*,java.util.*" %>
<%
   // 獲取session創(chuàng)建時(shí)間
   Date createTime = new Date(session.getCreationTime());
   // 獲取最后訪問(wèn)頁(yè)面的時(shí)間
   Date lastAccessTime = new Date(session.getLastAccessedTime());
   String title = "再次訪問(wèn)菜鳥(niǎo)教程示例";
   Integer visitCount = new Integer(0);
   String visitCountKey = new String("visitCount");
   String userIDKey = new String("userID");
   String userID = new String("ABCD");
   // 檢測(cè)網(wǎng)頁(yè)是否有新的訪問(wèn)用戶
   if (session.isNew()){
      title = "訪問(wèn)菜鳥(niǎo)教程示例";
      session.setAttribute(userIDKey, userID);
      session.setAttribute(visitCountKey,  visitCount);
   } else {
       visitCount = (Integer)session.getAttribute(visitCountKey);
       visitCount += 1;
       userID = (String)session.getAttribute(userIDKey);
       session.setAttribute(visitCountKey,  visitCount);
   }
%>
<html>
<head>
<title>Session 跟蹤</title>
</head>
<body>
<h1>Session 跟蹤</h1>
<table border="1" align="center"> 
<tr bgcolor="#949494">
   <th>Session 信息</th>
   <th>值</th>
</tr> 
<tr>
   <td>id</td>
   <td><% out.print( session.getId()); %></td>
</tr> 
<tr>
   <td>創(chuàng)建時(shí)間</td>
   <td><% out.print(createTime); %></td>
</tr> 
<tr>
   <td>最后訪問(wèn)時(shí)間</td>
   <td><% out.print(lastAccessTime); %></td>
</tr> 
<tr>
   <td>用戶 ID</td>
   <td><% out.print(userID); %></td>
</tr> 
<tr>
   <td>訪問(wèn)次數(shù)</td>
   <td><% out.print(visitCount); %></td>
</tr> 
</table> 
</body>
</html>

試著訪問(wèn) http://localhost:8080/testjsp/main.jsp ,第一次運(yùn)行時(shí)將會(huì)得到如下結(jié)果:

再次訪問(wèn),將會(huì)得到如下結(jié)果:

刪除Session數(shù)據(jù)

當(dāng)處理完一個(gè)用戶的會(huì)話數(shù)據(jù)后,您可以有如下選擇:

  • 移除一個(gè)特定的屬性:

    調(diào)用public void removeAttribute(String name)  方法來(lái)移除指定的屬性。

  • 刪除整個(gè)會(huì)話:

    調(diào)用public void invalidate() 方法來(lái)使整個(gè)session無(wú)效。

  • 設(shè)置會(huì)話有效期:

    調(diào)用 public void setMaxInactiveInterval(int interval)  方法來(lái)設(shè)置session超時(shí)。

  • 登出用戶:

    支持servlet2.4版本的服務(wù)器,可以調(diào)用 logout()方法來(lái)登出用戶,并且使所有相關(guān)的session無(wú)效。

  • 配置web.xml文件:

    如果使用的是Tomcat,可以向下面這樣配置web.xml文件:

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

超時(shí)以分鐘為單位,Tomcat中的默認(rèn)的超時(shí)時(shí)間是30分鐘。

Servlet中的getMaxInactiveInterval( ) 方法以秒為單位返回超時(shí)時(shí)間。如果在web.xml中配置的是15分鐘,則getMaxInactiveInterval( ) 方法將會(huì)返回900。

丰满人妻一级特黄a大片,午夜无码免费福利一级,欧美亚洲精品在线,国产婷婷成人久久Av免费高清