1.
總結一下tomcat 服務器里的三種監聽
ServletContextListener
HttpSessionListener
ServletRequestListener
這是我要做的三個自定義重寫 類 分別繼承上面三個接口
2具體源碼
(1) ServletContextListener
用於監聽服務器的啟動與關閉

1 package cn.cen2guo.clinic.listener; 2 3 4 import javax.servlet.ServletContextEvent; 5 import javax.servlet.ServletContextListener; 6 7 8 /** 9 * 用於監聽服務器的啟動與關閉 10 */ 11 public class MyServletContextListener implements ServletContextListener { 12 @Override 13 public void contextInitialized(ServletContextEvent sce) { 14 // System.out.println("創建ServletContext對象"); 15 } 16 17 @Override 18 public void contextDestroyed(ServletContextEvent sce) { 19 // System.out.println("銷毀ServletContext對象"); 20 } 21 }
(2) HttpSessionListener
用於監聽session的創建與銷毀

1 package cn.cen2guo.clinic.listener; 2 3 4 import javax.servlet.http.HttpSessionEvent; 5 import javax.servlet.http.HttpSessionListener; 6 7 /** 8 * 用於監聽session的創建於銷毀,目前沒啥用處 9 */ 10 11 public class MyHttpSessionListener implements HttpSessionListener { 12 13 @Override 14 public void sessionCreated(HttpSessionEvent se) { 15 // System.out.println("session 被創建了"); 16 // System.out.println(se.getSession().getId()); 17 } 18 19 @Override 20 public void sessionDestroyed(HttpSessionEvent se) { 21 // System.out.println("session 被銷毀了"); 22 // System.out.println(se.getSession().getId()); 23 // System.out.println("銷毀結束"); 24 } 25 26 27 }
(3)ServletRequestListener
用於監聽每一次請求 的開始【初始化】 與結束【銷毀】

package cn.cen2guo.clinic.listener; import javax.servlet.ServletRequestEvent; import javax.servlet.ServletRequestListener; /** * 用於監聽每一次請求, */ //使用注解@WebListener 和 @Component ,則不需要去web.xml文件里注冊監聽 , //同時spring掃面也不需要特意設定可以掃描到這里 ,但是仍然可以識別,這就很舒服了 //@WebListener //@Component public class MyServletRequestListener implements ServletRequestListener { @Override public void requestInitialized(ServletRequestEvent sre) { // System.out.println("requestInitialized 初始化"); } @Override public void requestDestroyed(ServletRequestEvent sre) { // System.out.println("requestDestroyed 銷毀"); } }
3. 注冊監聽有兩種,任意一種都可以:
方法一:使用spring注解
方法二 : 去web.xml文件注冊監聽標簽
4.心得
(1) 服務器開啟,servletcontextListener首先被使用。servletcontext被創建了;
服務器關閉的前一刻才會觸發其銷毀監聽內容
(2) 網頁向controller請求,ServletRequestListener 首先檢測出來,
執行了他的requestInitialized 方法,即初始化request;等待contronller事務結束后,才出發servletRequestListener的銷毀事件
(3)並不是每次前端向服務器請求 都會 驗證要不要創建Session ,而是當服務器調用了HttpServletRequest.getSession(true) 后,
才會創建一個服務器內獨一無二的session會話 ,其session id 則是自動分配一個無序的字符串,[得到兩個一樣的幾率非常低]
然后才保存在前端[一般在cookie里面]。
(4)session 可以設置存活時間,到期后自動注銷 ,但往往都是默認值,每當前端瀏覽器關閉后,session才開始以默認期限倒計時,
等待時間到后才銷毀,並不是瀏覽器一關閉,就會銷立馬銷毀 ,當然,也沒必要手動對其銷毀,讓其自毀自滅就行,
根據這一特性,就無法讓服務器判斷前端用戶是否仍在,想要實現這個功能,只能使用websocket 或者長輪詢,長輪詢太消耗資源了,不建議使用,
websocket則是最好的方式!!!
(5) 從Tomcat設置的cookie路徑來看,它對不同的應用程序設置的cookie路徑是不同的,這樣不同的應用程序所用的session id是不同的,因此即使在
同一個瀏覽器窗口里訪問不同的應用程序,發送給服務器的session id也可以是不同的。