javaWeb學習日記_20:HttpSession(重點)
1. HttpSession概述
* HttpSession是由JavaWeb提供的,用來會話跟蹤的類。session是伺服器端物件,儲存在伺服器端!!!
* HttpSession是Servlet三大域物件之一(request、session、application(ServletContext)),所以它也有setAttribute()、getAttribute()、removeAttribute()方法
* HttpSession底層依賴Cookie,或是URL重寫!
2. HttpSession的作用
* 會話範圍:會話範圍是某個使用者從首次訪問伺服器開始,到該使用者關閉瀏覽器結束!
> 會話:一個使用者對伺服器的多次連貫性請求!所謂連貫性請求,就是該使用者多次請求中間沒有關閉瀏覽器!
* 伺服器會為每個客戶端建立一個session物件,session就好比客戶在伺服器端的賬戶,它們被伺服器儲存到一個Map中,這個Map被稱之為session快取!
> Servlet中得到session物件:HttpSession session = request.getSession();
> Jsp中得到session物件:session是jsp內建物件之下,不用建立就可以直接使用!
* session域相關方法:
> void setAttribute(String name, Object value);
> Object getAttribute(String name);
> void removeAttribute(String name);
3. HttpSession原理(理解)
* request.getSession()方法:
> 獲取Cookie中的JSESSIONID:
<> 如果sessionId不存在,建立session,把session儲存起來,把新建立的sessionId儲存到Cookie中
<> 如果sessionId存在,通過sessionId查詢session物件,如果沒有查詢到,建立session,把session儲存起來,把新建立的sessionId儲存到Cookie中
<> 如果sessionId存在,通過sessionId查詢到了session物件,那麼就不會再建立session物件了。
<> 返回session
> 如果建立了新的session,瀏覽器會得到一個包含了sessionId的Cookie,這個Cookie的生命為-1,即只在瀏覽器記憶體中存在,如果不關閉瀏覽器,那麼Cookie就一直存在。
> 下次請求時,再次執行request.getSession()方法時,因為可以通過Cookie中的sessionId找到session物件,所以與上一次請求使用的是同一session物件。
* 伺服器不會馬上給你建立session,在第一次獲取session時,才會建立!request.getSession();
* request.getSession(false)、request.getSession(true)、request.getSession(),後兩個方法效果相同,
> 第一個方法:如果session快取中(如果cookie不存在),不存在session,那麼返回null,而不會建立session物件。
4. HttpSession其他方法:
* String getId():獲取sessionId;
* int getMaxInactiveInterval():獲取session可以的最大不活動時間(秒),預設為30分鐘。當session在30分鐘內沒有使用,那麼Tomcat會在session池中移除這個session;
* void invalidate():讓session失效!呼叫這個方法會被session失效,當session失效後,客戶端再次請求,伺服器會給客戶端建立一個新的session,並在響應中給客戶端新session的sessionId;
* boolean isNew():檢視session是否為新。當客戶端第一次請求時,伺服器為客戶端建立session,但這時伺服器還沒有響應客戶端,也就是還沒有把sessionId響應給客戶端時,這時session的狀態為新。
5. web.xml中配置session的最大不活動時間
<session-config>
<session-timeout>30</session-timeout>
</session-config>
6. URL重寫(理解)
就是把所有的頁面中的路徑,都使用response.encodeURL("..")處理一下!
* session依賴Cookie,目的是讓客戶端發出請求時歸還sessionId,這樣才能找到對應的session
* 如果客戶端禁用了Cookie,那麼就無法得到sessionId,那麼session也就無用了!
* 也可以使用URL重寫來替代Cookie
> 讓網站的所有超連結、表單中都新增一個特殊的請求引數,即sessionId
> 這樣伺服器可以通過獲取請求引數得到sessionId,從而找到session物件。
* response.encodeURL(String url)
> 該方法會對url進行智慧的重寫:當請求中沒有歸還sessionid這個cookie,那麼該方法會重寫url,否則不重寫!當然url必須是指向本站的url。