當session超時時,會調用httpSessionListener中的sessionDestroy()方法。
html
具體設置方法有三種:java
(1)在主頁面或者公共頁面中加入:session.setMaxInactiveInterval(900);能夠經過對應的getMaxInactiveInterval()獲取。參數900單位是秒,即在沒有活動15分鐘後,session將失效。另外,經過調用Session的invalidate()方法可使Session顯示失效。web
這裏要注意這個session設置的時間是根據服務器來計算的,而不是客戶端。因此若是是在調試程序,應該是修改服務器端時間來測試,而不是客戶端。spring
(2)也是比較通用的設置session失效時間的方法,就是在項目的web.xml中添加Xml代碼服務器
session-config :若是某個會話在必定時間內未被訪問,服務器能夠拋棄它以節省內存。session
可經過使用HttpSession的setMaxInactiveInterval方法明確設置單個會話對象的超時值,app
或者可利用session-config元素制定缺省超時值。框架
<!-- session-config包含一個子元素session-timeout.定義web站臺中的session參數. --> <session-config> <!-- 定義這個web站臺全部session的有效期限.單位爲分鐘. 例子中爲600分鐘 --> <session-timeout>600</session-timeout> </session-config>
在通常系統中,也可能須要在session失效後作一些操做,性能
(1)控制用戶數,當session失效後,系統的用戶數減小一個等,控制用戶數在必定範圍內,確保系統的性能。測試
(2)控制一個用戶屢次登陸,當session有效時,若是相同用戶登陸,就提示已經登陸了,當session失效後,就能夠不用提示,直接登陸了。
那麼如何在session失效後,進行一系列的操做呢?
這裏就須要用到監聽器了,即當session由於各類緣由失效後,監聽器就能夠監聽到,而後執行監聽器中定義好的程序就能夠了。
監聽器類爲:HttpSessionListener類,有sessionCreated和sessionDestroyed兩個方法
本身能夠繼承這個類,而後分別實現。
sessionCreated指在session建立時執行的方法
sessionDestroyed指在session失效時執行的方法
package com.yuan.Session; import java.text.SimpleDateFormat; import java.util.Date; import javax.servlet.http.HttpSession; import javax.servlet.http.HttpSessionEvent; import javax.servlet.http.HttpSessionListener; public class SessionListener implements HttpSessionListener { public void sessionCreated(HttpSessionEvent se) { // session建立時執行 SimpleDateFormat simpleFormat = new SimpleDateFormat("mm-ss-ms"); String nowtimes = simpleFormat.format(new Date()); //User u = (User)ActionContext.getContext().getSession().get("user");//structs的方法 //String username = (String)se.getSession().getAttribute("username");//用於獲取元素,對象 System.out.println("執行。。 當前時間:"+nowtimes+"); HttpSession ses= se.getSession(); String id=ses.getId()+"_"+ses.getCreationTime(); } public void sessionDestroyed(HttpSessionEvent arg0) { // session失效時執行 SimpleDateFormat simpleFormat = new SimpleDateFormat("mm-ss-ms"); String nowtimes = simpleFormat.format(new Date()); System.out.println("session失效時間: "+nowtimes); } }
這樣的代碼在傳統的Servlet程序中是很常見的:由於使用了 Servlet API,從而對 Servlet API產生依賴。這樣若是咱們要測試 action,咱們就必須針對 HttpServletRequest、HttpServletResponse 和 HttpSession類提供 mock 或者 stub 實現。固然如今已經有不少開源的 Servlet 測試框架幫助咱們減輕這個痛苦,包括 Spring 就自帶了對了這些類的 stub 實現,但那仍是太冗繁瑣碎了。那有沒有比較好的辦法來讓咱們的 controller 更 POJO,讓咱們的 action 脫離 Servlet API 依賴,更有益於測試和複用呢?咱們來看看在 Spring2.5 中訪問 Session 屬性的幾種解決方案,並將在本博的後續文章繼續探究解決方案選擇背後的深層含義。
備註:感受測試會有問題,比較麻煩。
參考博文:能夠查看該博文讀取詳細內容
Spring對annotationed的 action 的參數提供自動綁定支持的參數類型包括 Servlet API 裏面的 Request/Response/HttpSession(包含Request、Response在Servlet API 中聲明的具體子類)。因而開發人員能夠經過在 action 參數中聲明 Request 對象或者 HttpSession 對象,來讓容器注入相應的對象。
action 的代碼以下:
Java代碼
@RequestMapping public void hello(HttpSession session){ User user = (User)session.getAttribute("currentUser"); //... }