Session

Request 對象解決了一次請求內的不一樣 Servlet 的數據共享問題,而對於一個用戶的不一樣請求的處理須要使用相同的數據時咱們須要使用session 技術。web

原理

用戶使用瀏覽器第一次向服務器發送請求,服務器在接受到請求後,調用對應的 Servlet 進行處理。在處理過程當中會給用戶建立一個 session 對象,用來存儲用戶請求處理相關的公共數據,並將此 session 對象的 JSESSIONID 以 Cookie 的形式存儲在瀏覽器中 (臨時存儲,瀏覽器關閉即失效)。用戶在發起第二次請求及後續請求時,請求信息中會附帶 JSESSIONID,服務器在接收到請求後, 調用對應的 Servlet 進行請求處理,同時根據 JSESSIONID 返回其對應的 session 對象。瀏覽器

特色

  1. Session 技術是依賴Cookie 技術的服務器端的數據存儲技術
  2. 由服務器進行建立
  3. 每一個用戶獨立擁有一個session
  4. 默認存儲時間爲 30 分鐘
  5. 解決了一個用戶的不一樣請求的數據共享問題

使用

  1. 建立 Session 對象
  2. 存儲數據到 session 對象,再次訪問時獲取 session 對象
  3. 從 session 對象獲取數據
  4. 若是獲取 session 中不存在的數據返回null。
  5. 做用域:一次會話
只要不關閉瀏覽器,而且 session 不失效的狀況下,同一個用戶的任意請求在項目的任意 Servlet 中獲取到的都是同一個session 對象。

Servlet Session

HTTP 是一種"無狀態"協議,這意味着每次客戶端檢索網頁時,客戶端打開一個單獨的鏈接到 Web 服務器,服務器會自動不保留以前客戶端請求的任何記錄。三種方式來維持 Web 客戶端和 Web 服務器之間的 session 會話:服務器

  1. Cookies
  2. 隱藏的表單字段
  3. URL 重寫

HttpSession 對象

除了上述的三種方式,Servlet 還提供了 HttpSession 接口,該接口提供了一種跨多個頁面請求或訪問網站時識別用戶以及存儲有關用戶信息的方式。session

Servlet 容器使用這個接口來建立一個 HTTP 客戶端和 HTTP 服務器之間的 session 會話。會話持續一個指定的時間段,跨多個鏈接或頁面請求。網站

經過調用 HttpSession session = request.getSession(); 來獲取 HttpSession 對象。你須要在向客戶端發送任何文檔內容以前調用 request.getSession()。spa

HttpSession 對象中可用的幾個重要的方法:code

  • public Object getAttribute(String name): 該方法返回在該 session 會話中具備指定名稱的對象,若是沒有指定名稱的對象,則返回 null
  • public Enumeration getAttributeNames(): 該方法返回 String 對象的枚舉,String 對象包含全部綁定到該 session 會話的對象的名稱
  • public long getCreationTime(): 該方法返回該 session 會話被建立的時間,自格林尼治標準時間 1970 年 1 月 1 日午夜算起,以毫秒爲單位
  • public String getId(): 該方法返回一個包含分配給該 session 會話的惟一標識符的字符串
  • public long getLastAccessedTime(): 該方法返回客戶端最後一次發送與該 session 會話相關的請求的時間自格林尼治標準時間 1970 年 1 月 1 日午夜算起,以毫秒爲單位
  • public int getMaxInactiveInterval(): 該方法返回 Servlet 容器在客戶端訪問時保持 session 會話打開的最大時間間隔,以秒爲單位
  • public void invalidate(): 該方法指示該 session 會話無效,並解除綁定到它上面的任何對象
  • public boolean isNew(): 若是客戶端還不知道該 session 會話,或者若是客戶選擇不參入該 session 會話,則該方法返回 true
  • public void removeAttribute(String name): 該方法將從該 session 會話移除指定名稱的對象
  • public void setAttribute(String name, Object value): 該方法使用指定的名稱綁定一個對象到該 session 會話
  • public void setMaxInactiveInterval(int interval): 該方法在 Servlet 容器指示該 session 會話無效以前,指定客戶端請求之間的時間,以秒爲單位

刪除 Session 會話數據

  1. 移除一個特定的屬性:您能夠調用 public void removeAttribute(String name) 方法來刪除與特定的鍵相關聯的值
  2. 刪除整個 session 會話:您能夠調用 public void invalidate() 方法來丟棄整個 session 會話
  3. 設置 session 會話過時時間:您能夠調用 public void setMaxInactiveInterval(int interval) 方法來單獨設置 session 會話超時

web.xml 配置

使用的是 Tomcat,除了上述方法,您還能夠在 web.xml 文件中配置 session 會話超時,下面實例中的超時時間是以分鐘爲單位,將覆蓋 Tomcat 中默認的 30 分鐘超時時間。以下所示:xml

<session-config>
    <session-timeout>15</session-timeout>
</session-config>
相關文章
相關標籤/搜索