會話跟蹤(控制)

        會話(Session)跟蹤是Web程序中經常使用的技術,用來跟蹤用戶的整個會話。經常使用的會話跟蹤技術是 Cookie 和 Session。

1、Cookie

        Cookie 經過在客戶端記錄信息肯定用戶的身份,Session經過在服務器端記錄信息肯定用戶身份
    一、Cookie簡介:
    • Cookie 意爲「甜餅」,有 W3C組織提出。
    • Cookie的出現:因爲HTTP協議是一種無狀態的協議,服務器單從網絡鏈接上無從知道客戶身份,爲了解決此問題,因而出現了Cookie
    • Cookie其實是一小段的文本信息,客戶端請求服務器,若是服務器須要記錄該用戶狀態,就使用 response 向客戶端瀏覽器頒發一個 Cookie,客戶端瀏覽器會把Cookie保存起來。當瀏覽器再請求該網站時,瀏覽器把請求的網址連同Cookie一同提交給服務器,服務器會檢查該Cookie,以此來辨認用戶的狀態。服務器還能夠根據須要修改Cookie的內容
    二、Cookie的有效期:
    • Cookie的 maxAge 決定着 Cookie的有效期,單位爲:秒/s(Second)
      • Cookie中經過 getMaxAge() 方法和 setMaxAge(int  maxAge) 方法來讀寫 maxAge屬性
      • 若是 maxAge 屬性爲正數,則表示該 Cookie會在 maxAge 秒以後自動失效。瀏覽器會將 maxAge 爲正數的 Cookie持久化,即 寫到對應的Cookie文件中。不管客戶關閉了瀏覽器仍是電腦,只要在 maxAge 秒以前,登陸網站時該 Cookie仍然有效
      • 若是 maxAge 爲負數,則表示該 Cookie僅在本瀏覽器窗口以及本窗口打開的子窗口內有效,關閉窗口後該 Cookie當即失效。 maxAge 爲負數的 Cookie,爲臨時性 Cookie,不會被持久化,也不會被寫到 Cookie文件中。 Cookie 信息保存在瀏覽器內存中,所以關閉瀏覽器該 Cookie就消失了。 Cookie 默認的 maxAge 值 爲 -1
      • 若是 maxAge 爲 0,則表示刪除該 Cookie。 Cookie機制沒有提供刪除 Cookie的方法,所以經過設置該 Cookie即時失效實現刪除 Cookie的效果。 失效的Cookie會被瀏覽器從 Cookie文件或者 內存中刪除  
               
               
               
               
               
        //新建 Cookie對象Cookie cookie = new Cookie("userName","hello");//設置生命週期爲 0, 不能爲 負數cookie.setMaxAge(0);//必須執行下面這一句代碼response.addCookie(cookie);
    • response 對象提供的 Cookie 操做方法只有一個添加操做  addCookie(Cookie cookie) 。想要修改 Cookie 只能使用一個同名的 Cookie來覆蓋原來的Cookie,達到修改的目的。刪除時是須要把 maxAge 修改成 0 便可
    三、Cookie 的修改、刪除:
    • Cookie 並不提供修改、刪除操做,若是須要新建一個 同名的 Cookie,只須要新建一個同名的Cookie,並添加到 response 中覆蓋原來的Cookie
    • 若是想要刪除某個Cookie,只須要新建一個同名的Cookie,並將maxAge設置爲0,並添加到response中覆蓋原來的Cookie。注意:是 0 而不是 負數。負數表明其餘意義
    • 注意:修改、刪除Cookie時,新建的Cookie出value和maxAge以外的全部屬性(name、path、domain等)都要與原Cookie徹底同樣,不然,瀏覽器會將其視爲兩個不一樣的Cookie,不會覆蓋,致使修改或刪除失敗!

2、Session

    一、Session簡介:
    • Session是另外一種記錄客戶狀態的機制,不一樣的是 Cookie保存在瀏覽器中,二Session保存在服務器上。
    • 客戶端瀏覽器訪問服務器的時候,服務器吧客戶端信息以某種形式記錄在服務器上,這就是Session,客戶端瀏覽器再次訪問時只須要從該Session中查找客戶的狀態就能夠了
    • 若是說 Cookie 機制是經過檢查客戶身上的「通行證」來肯定客戶的身份的話,那麼 Session機制就是經過檢查服務器上的「客戶明細表」來確認客戶身份。
    • Session至關於程序在服務器上創建一份客戶檔案,客戶來訪時只須要查詢客戶檔案表就能夠了
    • Session對應的類爲 javax.servlet.http.HttpSession類,每個來訪者對應一個Session對象,全部該客戶的狀態信息都保存在這個Session對象裏。Session對象是在客戶端第一次請求服務器的時候建立的。
    • Session是一種 key-value 的屬性對。能夠經過 getAttribute(String  key) 和 setAttribute(String  key,  Object  value) 方法來讀寫客戶狀態信息。在Servlet中使用request.getSession() 方法來獲取該客戶的Session。
            
            
            
            
            
      //獲取Session對象HttpSession session = request.getSession();//設置Session中的屬性session.setAttribute("loginTime", new Date());//獲取session屬性out.println("登陸時間爲:" + (Date)session.getAttribute("loginTime"));
    • request 還可使用 getSession(boolean  create) 來獲取session。
      • 當 create 爲 true 時,當客戶端的Session不存在,則會先建立Session對象而後再將其返回
    二、Session的生命週期:
    • Session經過調用 invalidate() 方法來使Session對象失效
    • HttpSession的經常使用方法:
      • void  setAttribute(String  key, Object  value):設置Session屬性
      • String  getAttribute(String  key):返回Session屬性
      • Enumeration  getAttributeNames():返回Session中存在的屬性名
      • void  removeAttribute(String  key): 移除Session屬性
      • String  getId():返回Session的 ID,該ID由服務器自動建立,不會重複
      • long  getCreationTime(): 返回Session的建立日期,返回類型爲long,常被轉換爲Date類型。 eg: Date  createTime  =  new  Date(session.getCreationTime())
      • long  getLastAccessedTime(): 返回Session的最後活躍時間,返回類型爲long
      • int  getMaxInactiveInterval():返回Session的超時時間,單位爲:秒;超過該時間沒有訪問,服務器會認爲該Session失效
      • void  setMaxInactiveInterval(int  second): 設置Session的超時時間,單位爲:秒
      • boolean  isNew():返回該Session是不是新建立的
      • void  invalidate():使該 Session 失效
      • 小提示:Tomcat中Session的默認失效時間爲 20 分鐘,可經過 setMaxInactiveInterval(int  seconds) 修改超時時間。能夠修改 web.xml 改變Session的默認超時時間:
               
               
               
               
               
        <session-config> <!-- 此處的單位爲:分鐘 --> <session-timeout>60</session-timeout></session-config>
    三、URL地址重寫
    • 當客戶端瀏覽器將 Cookie功能禁用或者不支持Cookie時,Java Web 提供了另外一種解決方案: URL地址重寫
    • 原理:將該用戶Session的id信息重寫到URL地址中,服務器可以解析重寫後的URL獲取Session的id。這樣即便客戶端瀏覽器不支持 Cookie,也可使用Session來記錄用戶的狀態
    • HttpServletResponse類提供了 encodeURL(String  url):實現URL地址重寫
    四、Session中禁止使用 Cookie
    • 方式一:找到項目中的 META-INF 目錄(與WEB-INF同級,若是沒有則本身新建一                        個),新建一個 context.xml 文件(若是有就打開編輯):編輯內容爲:
            
            
            
            
            
      <?xml version='1.0' encoding='UTF-8' ?><Context path="/項目名稱" cookies="false"> </Context>
    • 方式二:修改Tomcat全局的 conf/context.xml 文件:
            
            
            
            
            
      <Context cookies="false"></Context>
    • 注意該配置只是禁止Session使用Cookie做爲識別標誌,並不能阻止其餘的Cookie讀寫,也就是說服務器不會自動維護名爲 JSESSIONID 的Cookie了,但程序中仍然能夠讀寫其餘的Cookie
相關文章
相關標籤/搜索