**過濾器_Filter&Listener [web基礎day18] *
阿新 • • 發佈:2019-01-02
今日內容
1.FIlter:過濾器
2.Listener:監聽器
Filter:過濾器
1.概念: * 生活中的過濾器:淨水器,空氣淨化器。 * web中的過濾器:當訪問伺服器的資源時,過濾器可以將請求攔截下來,完成一些特殊的功能。 * 過濾器的作用: * 一般用於一些完成通過的操作,如:登入驗證,統一編碼處理(設定請求資訊編碼和響應資訊編碼),敏感詞操作。 * 2.快速入門: 1.步驟 1.定義一個類,實現介面Filter 導包一定要:javax.servlet包下的Filter; * 如果呼叫方法的時候沒有該功能方法,那麼可能是導錯包了。 2.複寫方法 3.配置攔截路徑 1.註解配置 @WebFilter("/*") 訪問所有路徑。 @WebFilter("/demo")訪問demo的檔案。 * 執行了語句之後要考慮放行: filterChain.doFilter(servletRequest,servletResponse); 如果請求的是Servlet,則此方法會放請求去請求Servlet。如果沒有這行程式碼,那麼Filter則不放行,響應就會返回瀏覽器。(過濾器中的程式碼會執行兩次 --過去一遍,回來一遍。) 2.web.xml配置 -- 過程: * 瀏覽器發出請求,伺服器接收到請求 * 找有沒有配置過濾器,如果有。符不符合過濾器的攔截路徑 如果符合則被攔住 1.放行:直接訪問資源 2.不放行:原路返回 -- 如果不符合直接可以訪問資源。 2.過濾器細節: 1.web.xml配置 * 參見截圖文件。 2.過濾器執行流程 * 執行過濾器 * 執行放行後的資源 * 回來執行過濾器放行程式碼下邊的程式碼。 3.過濾器生命週期方法 * init:servlet被建立的時候執行一次。(當伺服器啟動之後會直接建立Filter物件),用於載入資源。 * destroy:servlet被銷燬的時候執行一次。(當伺服器正常關閉則執行此方法),用於釋放資源。 * doFilter:當瀏覽器發出請求,並且請求的路徑符合此Filter攔截路徑,則doFilter方法會被呼叫一次。可執行多次。 4.過濾器配置詳解 * 攔截路徑配置: 1.具體資源路徑:/index.jsp 只有訪問index.jsp資源時,過濾器才會被執行。 2.攔截目錄:/user/* :訪問/user下的所有資源時,過濾器都會被執行 3.字尾名攔截:*.jsp 訪問所有後綴名為jsp資源時,過濾器都會被執行。 4.攔截所有資源:/* 訪問所有資源時,過濾器都會執行。 * 攔截方式配置:資源被訪問的方式。 * 註解配置: * 設定dispatcherTypes屬性 1.REQUEST:預設值,瀏覽器直接請求資源。 2.FORWARD:轉發訪問資源 3.INCLUDE:包含訪問資源 4.ERROR:錯誤跳轉資源 5.ASYNC:非同步訪問資源 * web.xml配置 設定dispatcherTypes * 列舉的內容相當於看到靜態常用。 5.過濾器鏈(配置多個過濾器) * 執行順序:如果有兩個過濾器:過濾器1和過濾器2 1.過濾器1先執行 2.過濾器2再執行 3.資源執行 4.過濾器2 5.過濾器1 步驟演示:過濾器1-->過濾器2-->資源執行-->過濾器2-->過濾器1 * 過濾器先後順序問題: 1.註解配置:按照類名的字串比較,值小的先執行,從首字母開始,自然順序開始逐個比較,如果相等則取下一個比較,直到比出大小為止,字母在前的為先,數字小的為先,誰小先執行誰。 * 如:AFilter和BFilter,那麼AFilter先執行。 2.web.xml配置:<filter-mapping>誰定義在上邊,誰先執行。 * 配置多個過濾器可以讓每個過濾器實現單獨的功能,解耦合。 * 如何知道此請求是否是已經登入的使用者: * 如果登入了,則在Session中存一個登入使用者的id; * 有表示已經登入過了,則放行。 * 如果沒有,則沒有登入,跳轉到登入頁面。 -- 開閉原則:對於修改是關閉的,對於擴充套件是開放的。 4.案例: 1.案例1_登入驗證: 需要排除登入頁面,css檔案,js檔案,驗證碼伺服器檔案等。 * 需求: 1.訪問day17_case案例的資源。驗證其是否登入 2.如果登入了,則直接放行 3.如果沒有登入,則跳轉到登入頁面,提示:“您尚未登入,請先登入”。 2.案例2_敏感詞彙過濾 * 需求: *