開發者學堂課程【Filte(過濾器)、Listener(監聽器):Filter 的應用場景、Filter 的目标資源、小結】學習筆記,與課程緊密聯系,讓使用者快速學習知識。
課程位址:
https://developer.aliyun.com/learning/course/38/detail/878Filter 的應用場景、Filter 的目标資源、小結
内容介紹
一、過濾器的應用場景。
二、案例分類。
三、設定目标資源。
四、Filter mapping 的子元素。
五、Filter小結。
1、執行目标資源之前做預處理工作,例如設定編碼,這種試通常都會放行 ,隻是在目标資源執行之前做一些準備工作。
(批注:幾乎所有的 Servlet 中都需要寫request.setCharacterEndoing()可以把它寫到一個Filter中。)
(過濾器不會做攔截操作,隻是設定編碼。)
2、通過條件判斷是否放行,例如校驗目前使用者是否已經登入,或者使用者IP是否已經被禁用。(有攔截操作,判斷Id是否在禁用區域。)
3、在目标資源執行後,做一些後續的特殊處理工作,例如把目标資源輸出的資料進行處理。(批注:回程攔截!)
1、分IP統計通路次數:第一種預處理。
2、粗粒度權限控制:資源分為三個等級。如在淘寶中,為遊客、會員、管理者,可以通路商品不可查詢訂單為遊客等級,既可以通路商品又可查詢訂單的為會員等級,可以調價格的為管理者等級。
這屬于第二種通過條件判斷。
3、解決全站字元亂碼:第一種預處理 。
4、頁面靜态化:第三種回程攔截,做後續處理。
在web.xml檔案中部署Fiter時, 可以通過“*”來執行目标資源:
這一特性與Servlet完全相同!通過這一特性,我們可以在使用者通路敏感資源時,執行過濾器,例如:admin/*可以把所有管理者才能通路的資源放到/admin路徑下,這時可以通過過濾器來校驗使用者身份。
還可以為filter-mapping〉指定目标資源為某個Servlet,例如:
< filter-mapping>
myfilter
/*
批注:/*表示過濾所有資源
< servlet>
< servlet-name>
myservlet
< servlet-class
> cn.itcast.servlet.MyServlet
< servlet-name>
myservlet
< servlet-
name
>
/abc
>
<
s
evlet-mapping
>
> myfilter< /filter-name>
< filter-class
>
cn.itcaat.
filter.
MyFilterilter
-class>
< filter-mapping>
myfilter
'
<
servlet-name >
m
yservlet
servlet-name)
mapping>
批注:
<
servlet-name >
m
yservlet
servlet-name)
這裡沒有指定< url-patter>,而是指定< server-name>!注意,它與某個 servlet 的配置名稱相同!
當使用者通路http: localhost:8080/filtertest/abc時,會執行名字為 myservlet 的servlet ,這時會執行過濾器。
注:serlet-name 指定方式可以有多個。
四、Filter-mapping 的子元素。
;
。
五、Filter 小結。
1、filter 的三個方法。
①void init (filterConfig):在 Tomcat 啟動時被調用;
②void destroy(): 在 Tomcat 關閉時被調用;
③void doFitertServletRequest,ServletResponse,FterChain):每次有請求時都調用該方法。
2、FilterConfig類: 與 ServletConfig 相似,用來擷取 Fiter 的初始化參數。
①ServletContext getServletContext(): 擷取 ServletContext 的方法;
②String getFiterName):擷取 Fiter 的配置名稱;
③string getnitParametert(string name):擷取Fiter的初始化配置,與〈init-param〉元素對應;
④Enumeration getinitParameterNames(): 擷取所有初始化參數的名稱。
3、FRerChain 類
void doFiter(ServletRequest,ServletResponse):放行!表示執行下一個過濾器,或者執行目标資源,可以在調用 FiltetChain 的 doFiter()方法的前後添加語句,在FilterChain的dofiter()方法之後的語句會在目标資源執行之後執行。
4、四種攔截方式 :REQUEST,FORWARD,INCLUDE,ERROR,預設是 REQUEST 方式。
①REQUEST:攔截直接請求方式;
②FORWARD:攔截請求轉發方式 ;
③INCLUDE:攔截請求包含方式;
④ERROR:攔截錯誤轉發方式。