Session的建立和銷燬
一個常見的錯誤是以為 session 在有客戶端訪問時就被建立,然而事實是直到某 server 端程式(如 Servlet )呼叫
HttpServletRequest.getSession(true) //false 不會自動建立Session
這樣的語句時才會被建立。所以沒有呼叫getSession方法則不會建立session。
要了解Session首先要知道一個概念:Session的銷燬只有兩種情況:
第一:session呼叫了 session.invalidate()方法。
第二:前後兩次請求超出了session指定的生命週期時間。
其中Session的生命週期時間可以在web.xml配置。預設30分鐘 在web.xml可以做如下配置:
<session-config> <session-timeout>5</session-timeout> </session-config>
如何來證明關閉瀏覽器的時候Session沒有銷燬呢? 我們可以建立一個SessionListener 此監聽器專門用來監聽Session的生命週期的.程式碼如下:
// 新建一個session時觸發此操作 public void sessionCreated(HttpSessionEvent se) { System.out.println(se.getSession().getId()); } // 銷燬一個session時觸發此操作 public void sessionDestroyed(HttpSessionEvent se) { System.out.println(se.getSession().getId()); }
別忘記在web.xml中配置監聽器, 配置完畢後 可以做個測試。當瀏覽器關閉後此監聽器的 sessionDestroyed方法並沒有執行,而是在5分鐘左右(個人電腦沒有那麼精確) 才會觸發sessionDestroyed ,當然 再開啟瀏覽器的時候 sessionCreated 會自動呼叫 關閉5分鐘後sessionDestroyed 又會自動呼叫, 通過getID方法大家可以判斷是否為同一個Session. 所以網上說明的關閉瀏覽器Session就消失.其實並不正確。如果沒有任何配置的情況下. 關閉瀏覽器30分鐘後Session才會消失的。
我們可以利用這個概念做什麼呢? 最典型的就是利用 SessionListener 的sessionDestroyed方法 來記錄使用者非正常退出的時間. 使用者在訪問某個網站的時候(目前的銀行網站都有此功能) 顯示了使用者的最後登入時間. 此時間如何獲取. 在這裡分兩種情況
如果使用者按"退出" 按鈕那就好說了. 跳轉到action中.記錄下使用者退出的時間. 儲存到持久層中。
如果使用者非正常退出, 在沒有配置Session的情況下 預設會在30分鐘後呼叫sessionDestroyed 那麼我們同樣可以在此獲取使用者退出的時間,在sessionDestroyed 呼叫業務邏輯完成我們想要實現的功能。