接着上篇的Servlet總結。
引言:
1、什麼是會話?
- 從打開瀏覽器,到訪問頁面,到最終關閉瀏覽器 ,整個過程就是一次會話
2、會話的特性?
- 一個會話中可能包含多個請求
- 一次完整的會話只針對一個用戶
3、會話管理技術:
- Cookie 技術:客戶端技術
- Session技術:服務器技術
本篇blog就來總結下Cookie和Session的使用
一、Cookie 技術:客戶端技術
1、什麼是Cookie?
- Cookie是HTTP協議的規範之一,它是服務器和客戶端之間傳輸的小數據。
- Cookie就是服務器保存在客戶端的數據!(類似於會員卡,保存在用戶手中(客戶端))
- Cookie是一個鍵值對!
2、Cookie的常用用途:
- 站點跟蹤特定訪問者訪問的次數,最後訪問的時間以及訪問者進入站點的路徑;
- 幫助站點統計用戶個人資料以實現各種各樣的個性化服務。
- 實現自動登錄功能
3、Cookie的執行原理:
- 第一次訪問服務器,服務器會增加Set-Cookie頭字段,將Cookie信息發送給瀏覽器,並保存在客戶端。
- 當後續訪問服務器時,會在請求消息中將用戶信息以Cookie的形式發送給服務器,從而使服務器端分辨出當前請求是由哪個用戶發出的。
類 javax.servlet.http.Cookie 表示cookie
獲取Cookie信息的方法:
getName()名稱,
getValue()值,
getPath()cookie所在的目錄,
getDomain()有效域
getMaxAge()有效時間,
getSecure()只能使用安全的協議
設置Cookie信息的方法:
setValue(),
setPath(),
setDomain(),
setMaxAge()設置在客戶端硬盤上保存的最大時間,單位爲秒
從請求中獲取Cookie:
Cookie[] HttpServletRequest.getCookies( )
向響應中添加cookie:
HttpServletResponse.addCookie("name","value")
4、向客戶端寫入Cookie:
1、創建Cookie
Cookie c=new Cookie("name", "value");
2、設置Cookie的屬性
c.setMaxAge(60*60*24);
c.setDomain("pdsu.edu.cn")
c.setPath("/")
3、調用response的addCookie方法將其寫入到客戶端
response.addCookie(c)
5、讀取Cookie的步驟:
從客戶端讀取所有能夠被本服務器讀取的Cookie:
Cookie[] cookies=request.getCookies();
從中找出需要的Cookie:
for(int i=0;i<cookies.length;i++) {
if( cookies[i].getName().equals(“wanted”) ){
......
}
}
例:
使用Cookie對象實現歡迎信息,當用戶第一次訪問應用時顯示歡迎信息,並提示第1次訪問,依次類推。
代碼如下:
package cn.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class IndexServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
Cookie[] cookies = request.getCookies();
Integer integer = 0;
if (cookies != null) {
for (int i = 0; i < cookies.length; i++) {
if ("A".equals(cookies[i].getName())) {
integer = Integer.parseInt(cookies[i].getValue());
}
}
}
integer++;
Cookie cookie = new Cookie("A", integer + "");
if (integer <= 1) {
response.getWriter().append("歡迎A").append("首次訪問本網站");
} else {
response.getWriter().append("歡迎A第").append(integer + "").append("次訪問本網站");
}
cookie.setMaxAge(10);
response.addCookie(cookie);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
二、Session技術:服務器技術
1、什麼是Session技術?
- 一種會話管理技術,將會話中的數據保存到服務器端。
- 是基於會話級別的cookie實現的。
- 通俗的講session技術就好比醫院發放給病人的就醫卡和醫院爲每個病人保留病例檔案的過程,病人去醫院看病,只需要出示就醫卡,醫生根據卡號可以查到病人的就診信息。
- 當瀏覽器訪問服務器時,Servlet容器就會創建一個Session對象和ID屬性,其中,Session對象就相當於病歷檔案,ID就相當於就醫卡號,在後續訪問時,只要將標識號傳遞給服務器,就能判斷出是哪個客戶端發送的,從而選擇與之對應的Session對象爲其服務, 通常情況下Session是藉助Cookie技術來傳遞ID屬性的。
2、Session實現原理:
圖解:
-
session中的數據可以被一個用戶在一次會話中共享。
-
每個人的session是不同的。
- session_id的檢索和創建:
3、Session會話:
1、什麼是會話跟蹤技術?
- HTTP是無狀態協議,也就是沒有記憶力的協議,每個請求之間無法共享數據。這就無法知道會話什麼時候開始,什麼時候結束,也無法確定發出請求的用戶身份。這說明需要使用額外的手段來跟蹤會話!
- 在一個會話中共享數據即會話跟蹤技術
2、會話追蹤過程可劃分爲:
3、常用的會話追蹤機制有:
-
Cookies
特點:最常用
原理:引擎把用戶會話ID保存在cookie中,保存到客戶端,在以後的請求中把這個cookie發送給服務器 -
URL重寫
特點:性能最低
使用情況:客戶端不能接受cookie時
原理:把session id寫入URL中,這樣的URL會被引擎解析和某個session相關聯
例子:http://www.myser.com/catalog/index.htm;jsessionid=1234
-
表單隱藏
原理:利用HTML內hidden的屬性,把客戶端的信息,在用戶不察覺的情形下,偷偷地隨着請求一起傳送給到服務器處理
使用:
<input type="hidden" name="userID" value="15">
優點:session數據傳送到服務器端時,不會將session數據暴露在URL之上
缺點:用戶直接觀看HTML的源文件,session數據將會暴露無疑
4、會話追蹤機制比較:
5、會話管理機制:
- 創建會話:
HttpServletRequest
的getSession( )
方法,若有會話則返回當前會話,沒有則創建新會話getSession(true)
和上面執行同樣的功能。getSession(false)
訪問一個現有的會話、而不是新創建一個會話,如果沒有合法的會話則返回null
例:
HttpSession session=request.getSession(true)
- 存儲和訪問會話屬性:
- 標準會話屬性包括:會話標識符、數據、創建時間、上次訪問時間等,都以
“名-值”對
形式保存 - HttpSession提供了一種把對象存儲到內存、在同一用戶的後繼請求中提取這些對象的標準辦法
- 在會話中保存數據的方法:
setAttribute(String s, Object o)
- 從會話提取原來所保存對象的方法:
getAttribute(String s)
- 關閉會話:
1.顯式關閉:HttpSession.invalidate( )
2.隱式關閉—會話超時(等待超時自動操作)
- 默認的超時時間間隔是1800秒
- 無效之前,可以使用setInactiveInterval(int seconds)方法在客戶請求之間控制這個時間間隔。
- 設置負值可以確保會話永遠不會超時
4、Session常用方法:
getAttribute()從session中獲取以前存儲的值
setAttribute()將鍵與值關聯起來,存儲進session
removeAttribute()刪除session中存儲的對應鍵的值
invalidate()刪除整個session及其存儲的鍵值
logout()註銷當前用戶
getId()獲取每個session對應的唯一ID
getCreationTime()獲取session創建的時間
getLastAccessedTime()獲取session最後被訪問的時間
getMaxInactiveInterval()在用戶沒有訪問的情況下,會話在被自動廢棄之前應該保持多長時間
getAttributeNames()返回session中所有屬性的名稱
5、Session監聽器:
作用:監聽對象的動作(創建、銷燬等)和狀態
- 創建的新的session對象
- 銷燬session對象
要實現session監聽器, 需要實現 javax.servlet.http.HttpSessionListener
接口