servlet filter listener 含義
Servlet規範中定義,預設情況下(Servlet不是在分散式的環境中部署),Servlet容器對宣告的每一個Servlet,只建立一個例項。如果有多個客戶端請求同時訪問這個Servlet,Servlet容器如何處理多個請求呢?答案是採用多執行緒,Servlet容器維護一個執行緒池來服務請求。當容器接收到一個訪問Servlet的請求,排程者執行緒從執行緒池中選取一個工作執行緒,將請求傳遞給該執行緒,然後由這個執行緒執行Servlet的service()方法。
執行緒安全的Servlet
變數的執行緒安全
因為Servlet是單例項多執行緒模型,多個執行緒共享一個Servlet例項,因此對於例項變數的訪問是非執行緒安全的。
建議:在Servlet中儘可能的使用區域性變數,應該只使用只讀的例項變數和靜態變數。如果非得使用共享的例項變數或靜態變數,在修改共享變數時應該注意執行緒同步。
屬性的執行緒安全
在Servlet中,可以訪問儲存在ServletContext、HttpSession和ServletRequest物件中的屬性。那麼這三種不同範圍的物件,屬性訪問是否是執行緒安全的呢?
ServletContext:該物件被Web應用程式的所有Servlet共享,多執行緒環境下肯定是非執行緒安全的。
HttpSession:HttpSession物件只能在同屬於一個Session的請求執行緒中共享。對於同一個Session,我們可能會認為在同一時刻只有一個使用者請求,因此,Session物件的屬性訪問是執行緒安全的。但是,如果使用者開啟多個同屬於一個程序的瀏覽器視窗,在這些視窗中的訪問請求同屬於一個Session,對於多個執行緒的併發修改顯然不是執行緒安全的。
ServletRequest:因為Servlet容器對它所接收到的每一個請求,都建立一個新的ServletRequest物件,所以ServletRequest物件只在一個執行緒中被訪問,因此對ServletRequest的屬性訪問是執行緒安全的。但是,如果在Servlet中建立了自己的執行緒,那麼對ServletRequest的屬性訪問的執行緒安全性就得自己去保證。此外,如果作死的將當前請求的Servlet通過HttpSession或者ServletContext共享,那當然也是非執行緒安全的。
Listener
當Web應用在Web容器中執行時,Web應用內部會不斷地發生各種事件:如Web應用的啟動和停止、使用者Session的開始和結束等,通常這些Web事件對開發者是透明的。Listener(監聽器)是觀察者模式的應用,通過方法回撥來實現。
Listener生命週期
Listener在當web容器啟動的時候,去讀取每個web應用的web.xml配置檔案,當配置檔案中配有filter和listener時,web容器例項化listener,listener是當某個事件發生時,呼叫它特定方法,如HttpSessionListener,當建立一個session時會呼叫它的sessionCreated()方法,當servlet容器關閉或者重新載入web應用時lister物件被銷燬。
Listener分類
不同功能的Listener 需要實現不同的 Listener 介面,一個Listener也可以實現多個介面,這樣就可以多種功能的監聽器一起工作。常用監聽器:
1)監聽 Session、request、context 的創建於銷燬,分別為
HttpSessionLister、ServletContextListener、ServletRequestListener
2)監聽物件屬性變化,分別為:
HttpSessionAttributeLister、ServletContextAttributeListener、ServletRequestAttributeListener
Filter應用場景
1、統一POST請求中文字元編碼的過濾器
2、控制瀏覽器快取頁面中的靜態資源的過濾器
有些動態頁面中引用了一些圖片或css檔案以修飾頁面效果,這些圖片和css檔案經常是不變化的,所以為減輕伺服器的壓力,可以使用filter控制瀏覽器快取這些檔案,以提升伺服器的效能。
3、使用Filter實現URL級別的許可權認證
在實際開發中我們經常把一些執行敏感操作的servlet對映到一些特殊目錄中,並用filter把這些特殊目錄保護起來,限制只能擁有相應訪問許可權的使用者才能訪問這些目錄下的資源。從而在我們系統中實現一種URL級別的許可權功能。
4、實現使用者自動登陸
首先,在使用者登陸成功後,傳送一個名稱為user的cookie給客戶端,cookie的值為使用者名稱和md5加密後的密碼。編寫一個AutoLoginFilter,這個filter檢查使用者是否帶有名稱為user的cookie,如果有,則呼叫dao查詢cookie的使用者名稱和密碼是否和資料庫匹配,匹配則向session中存入user物件(即使用者登陸標記),以實現程式完成自動登陸。
Filter應用例項
與開發 Servlet 不同的是,Filter 介面並沒有相應的實現類可供繼承,要開發過濾器,只能直接實現 Filer 介面。
---------------------
本文轉載於https://blog.csdn.net/sunxianghuang/article/details/52107376