HttpSession的深入分析與研究
來源:程序員人生 發布時間:2014-09-06 11:36:25 閱讀次數:2959次
HTTP是無狀態協議,這意味著每次客戶端檢索網頁時,都要單獨打開一個服務器連接,因此服務器不會記錄下先前客戶端請求的任何信息。
有三種方法來維持客戶端與服務器的會話:
1.網絡服務器可以指定一個唯一的session ID作為cookie來代表每個客戶端,用來識別這個客戶端接下來的請求。
這可能不是一種有效的方式,因為很多時候瀏覽器并不一定支持cookie,所以我們不建議使用這種方法來維持會話。
2.重寫URL
舉例來說,http://baidu.com;sessionid=12345, session標識符為sessionid=12345,服務器可以用這個數據來識別客戶端。
相比而言,重寫URL是更好的方式來,就算瀏覽器不支持cookies也能工作,但缺點是您必須為每個URL動態指定session ID,就算這是個簡單的HTML頁面。
3.除了以上幾種方法外,JSP利用servlet提供的HttpSession接口來識別一個用戶,存儲這個用戶的所有訪問信息。
JSP引擎將隱含的session對象暴露給開發者。由于提供了session對象,開發者就可以方便地存儲或檢索數據。
下表列出了session對象的一些重要方法:
1 |
public Object getAttribute(String name)
返回session對象中與指定名稱綁定的對象,如果不存在則返回null |
2 |
public Enumeration getAttributeNames()
返回session對象中所有的對象名稱 |
3 |
public long getCreationTime()
返回session對象被創建的時間, 以毫秒為單位,從1970年1月1號凌晨開始算起 |
4 |
public String getId()
返回session對象的ID |
5 |
public long getLastAccessedTime()
返回客戶端最后訪問的時間,以毫秒為單位,從1970年1月1號凌晨開始算起 |
6 |
public int getMaxInactiveInterval()
返回最大時間間隔,以秒為單位,servlet 容器將會在這段時間內保持會話打開 |
7 |
public void invalidate()
將session無效化,解綁任何與該session綁定的對象 |
8 |
public boolean isNew()
返回是否為一個新的客戶端,或者客戶端是否拒絕加入session |
9 |
public void removeAttribute(String name)
移除session中指定名稱的對象 |
10 |
public void setAttribute(String name, Object value)
使用指定的名稱和值來產生一個對象并綁定到session中 |
11 |
public void setMaxInactiveInterval(int interval)
用來指定時間,以秒為單位,servlet容器將會在這段時間內保持會話有效 |
那在實踐開發中是如何使用的呢?
下面我們就通過一個簡單的例子查看session的使用
web.xml
<servlet>
<servlet-name>Session</servlet-name>
<servlet-class>com.qzp.servlet.sessionServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Session</servlet-name>
<url-pattern>/session</url-pattern>
</servlet-mapping>
sessionTest.jsp
<body>
<form action="session" method="post">
<input type="submit" value="查看session">
</form>
</body>
sessionServlet
public class sessionServlet extends HttpServlet {
/**
*
*/
private static final long serialVersionUID = 1L;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
// TODO Auto-generated method stub
this.doGet(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
HttpSession session = req.getSession();
// 獲取session創建時間
// 通過simpleDateFormat轉化日期格式
Date createTime = new Date(session.getCreationTime());
SimpleDateFormat st1=new SimpleDateFormat ("yyyy年MM月dd日 HH時mm分ss秒 E");
String time1=st1.format(createTime);
// 獲取最后訪問頁面的時間
Date lastAccessTime = new Date(session.getLastAccessedTime());
SimpleDateFormat st2=new SimpleDateFormat ("yyyy年MM月dd日 HH時mm分ss秒 E");
String time2=st2.format(lastAccessTime);
//訪問用戶的唯一標識id 的key-value
String userIDValue = "0011";
//訪問次數的 key-value
//注意session的構造方法public void setAttribute(String name, Object value)
//此構造方法之中 key是一個String類型的變量;value是一個object類型變量
int visitCountValue;
visitCountValue = (Integer)session.getAttribute("visitCount");
//判斷是否為新用戶
if (session.isNew()){
session.setAttribute("idKey", userIDValue);
session.setAttribute("visitCount", visitCountValue);
}
visitCountValue = visitCountValue + 1;
session.setAttribute("visitCount", visitCountValue);
session.setAttribute("idKey", userIDValue);
session.setAttribute("time1", time1);
session.setAttribute("time2", time2);
req.getRequestDispatcher("sessionResult.jsp").forward(req, resp);
}
}
sessionResult.jsp,前臺通過EL表達式取到session范圍內的值
<body>
<center>
<p>Session Tracking</p>
</center>
<table border="1" align="center">
<tr bgcolor="#949494">
<th>Session info</th>
<th>Value</th>
</tr>
<tr>
<td>id</td>
<td>${sessionScope.idKey}</td>
</tr>
<tr>
<td>Creation Time</td>
<td>${sessionScope.time1}</td>
</tr>
<tr>
<td>Time of Last Access</td>
<td>${sessionScope.time2}</td>
</tr>
<tr>
<td>Number of visits</td>
<td>
${sessionScope.visitCount}
</td>
</tr>
</table>
</body>
執行結果如下:每一次刷新,頁面的visitCount都會加1

生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈