1.什么是會話與會話狀態
1.1 會話是指一個客戶端與web服務器之間連續發生的一系列請求和響應的過程。就像是從撥通電話到掛斷電話之間聊天的過程就是一個會話。
1.2 web應用的會話狀態是指服務器與瀏覽器在會話過程中產生的狀態信息,借助會話狀態,web服務器能夠把屬於同一會話中的一系列請求和響應過程關聯起來,使得他們之間可以相互依賴和傳遞信息。例如在一個購物網站購買東西,結算時必須知道登錄請求表單的結果,以便知道是哪個賬戶在操作。還必須知道已選商品的信息。其中的用戶登錄的賬戶信息和已選商品信息就是會話的狀態信息。
2.cookies與session
由於http協議本身就是不具有會話狀態,web應用需要使用cookies或session來維持會話狀態和實現會話管理。
2.1 cookies
cookies是在瀏覽器訪問web服務器的某個資源時, 由web服務器在HTTP響應消息頭中附帶傳給瀏覽器的一些數據。其具體過程圖:
2.1.1 客戶端請求服務器,如果服務器需要記錄該用戶狀態,web服務器通過在HTTP消息頭增加Set_Cookies響應頭字段將cookies發送給瀏覽器。即向客戶端瀏覽器頒發一個Cookie。客戶端瀏覽器會把Cookie保存起來。當瀏覽器再請求該網站時,瀏覽器把請求的網址連同該Cookie一同提交給服務器。服務器檢查該Cookie,以此來辨認用戶狀態。服務器還可以根據需要修改Cookie的內容。基於springMVC的cookies的操作可以參照如下cookies的操作
2.1.2 一個cookies只能標識一種信息,它至少含有一個標識該信息的名稱name和值value,一個web站點可以給一個web瀏覽器發送多個cookies,這樣就能在web瀏覽器和服務器之間使用多個cookies來傳遞信息。例如用一個cookies來標識訪問者的賬號信息,一個cookies來標識用戶登錄該站點的次數。
注意:cookies需要瀏覽器的支持,而且不同瀏覽器有不同保存cookies的方式。
2.2 session
2.2.1 什么是session
cookies是客戶端保存狀態的方案,那么session是服務端保持狀態的方案。就像醫院發放給病人的病歷卡和醫院為每個病人都保存的檔案的結合。病歷卡只有id,在醫院出示病歷卡時,醫院系統都能根據其id找到病人的檔案,並進行相應的操作。
2.2.2 HttpSession
HttpSession接口定義了各種管理和操作會話狀態的方法。每個客戶端都有對應着其各自的HttpSession對象。由於創建HttpSession需要小號內存資源,Servlet並不會一開始就創建該對象,只有訪問某個特殊的Servlet程序,並且這程序決定於客戶端開啟一個會話時才會創建該對象。並且會為這個對象分配一個獨一無二的會話標識號SessionID,然后響應消息中將這個標致號傳給客戶端。后續客戶端只需將這個標識號傳給服務器,服務器依據其標識號選擇對應的HttpSession對象。
HttpSession停留在服務器內存也是有時間限定的。默認值由servlet容器決定,用tomcat的可以在tomcat的安裝路徑里的conf/Web.xml定義:
<session-config> <session-timeout>30</session-timeout> </session-config>
默認30分鍾,設置0或負數會話永不超時。
2.2.3 HttpSession接口的相關方法
(1) getId():返回HttpSession對象關聯的會話標識號
(2) getCreateTime 返回當前該對象創建的時間,返回值是一個自從1970年1月1日的0時0分0秒開始計算的毫秒數
(3) getLastAccessedTime 返回上一次訪問該對象的時間,返回值同上。
(4) setMaxInactiveInterval/getMaxInactiveInterval 操作該對象的超時默認時間。
(5) Invalidate 強制當前的HttpSession對象無效,使服務器立即釋放該對象。常用於注銷操作。
(6) getServletContext 用於返回當前HttpSession對象所屬的ServletContext對象。
(7) setAttribute/getAttribute 在內部定義一個hashmap類型的成員變量,該方法則是向這個hashmap對象增加鍵值對對象,和根據名稱獲取對象。如:
User user=new User("男","李"); HttpSession session=request.getSession();//當前的session session.setAttribute("user",user); //session.getAttribute("user",user);
2.2.4 HttpServletRequest接口的Session
(1)getSession方法 該方法有兩個重載方法:
public HttpSession getSession(boolean create); public HttpSession getSession();
第一個方法根據傳送參數來決定是否創建HttpSession對象。true就創建新的HttpSession對象,並返回,false如果沒有會話則返回null。
第二個方法如果沒有會話則創建一個新的會話。