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。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章