一、Filter
1、 Filter簡介
> Filter翻譯為中文是過濾器的意思。
> Filter是JavaWeb的三大web組件之一:Servlet、Filter、Listener
> Filter的作用是在請求到達WEB資源(HTML、CSS、Servlet、JSP)之前進行攔截。
> Filter需要交給Tomcat訪問器來管理
2、 Filter的作用:
1.Filter可以在請求到達目標資源之前進行攔截
2.Filter也可以放行請求
3.Filter可以在響應到達瀏覽器之前做一個預處理
3、 Filter的創建步驟
1.創建一個類實現Filter接口
2.在web.xml文件中對Filter進行配置
<filter>
<filter-name>Filter的別名</filter-name>
<filter-class>Filter的全類名</filter-clas
</filter>
<filter-mapping>
<filter-name>別名</filter-name>
<url-pattern>需要Filter攔截的資源地址</url-pattern>
</filter-mapping>
4、 Filter的生命周期
> 一個請求的發送,到響應返回是一個線程。
> Filter的生命周期,指的是Filter對象由被創建到被銷毀的過程。
> Filter的生命周期方法:
- 構造器:Filter的構造器在服務器啟動時調用。 構造器只會調用一次,說明Filter也是單例多線程的。
- init():在構造器被調用后,緊接着被調用。作用:用來初始化Filter。
- doFilter():每一次攔截請求時都會調用。
參數
ServletRequest request
> 請求報文
ServletResponse response
> 響應報文
FilterChain chain
> 該對象的作用就是放行請求:
可以通過 chain.doFilter(request,response) 放行請求。
當調用chain.doFilter()就相當於調用目標的資源的service方法。
- destroy方法在項目停止時調用,用來在對象被銷毀前做一些收尾工作。
5、url-pattern的設置規則:
1.精確匹配:只有當目標資源的地址和url-pattern的地址一模一樣時,Filter才會攔截資源
例子:/2.jsp , 只有當瀏覽器訪問項目根目錄下的2.jsp時,才會調用Filter
2.路徑匹配:當訪問的資源在url-pattern配置的路徑下時,Filter就會攔截資源。
例子1:/hello/* , 只要訪問項目根目錄下hello下的資源,就會調用Filter。
例子2:/* , 會攔截項目根目錄下所有資源
3.后綴匹配:只要訪問的資源地址和url-pattern的后綴一樣就會調用Filter
例子:*.jsp 只要是以jsp結尾的請求都會攔截
- 以上規則適用於Servlet的url-pattern配置
- 當使用Filter攔截一個Servlet時,可以將Filter的url-pattern和Servlet的url-pattern一樣,這樣Filter就會攔截發送到Servlet的請求。
- 也可以通過在filter-mapping中添加一個servlet-name標簽來設置要攔截的Servlet的name
6、Filter的執行順序
> 我們可以為一個資源設置多個過濾器,
當我們為一個資源設置了多個過濾器時,這些過濾器就組成一個Filter鏈的結構。
當我們去調用chain.doFilter(),如果該過濾器后邊還有其他的過濾,
相當於調用了下一個過濾器doFilter()方法
如果過濾器后沒有其他的過濾器,我們調用chain.doFilter()
相當於調用了目標資源的service()方法。
> 多個Filter的執行順序,有filter-mapping標簽的配置順序決定,
filter-mappint靠前,則filter先執行,靠后則后執行。
> 我們可以通過修改filter-mapping的順序來修改Filter的執行順序,
7、 登錄練習
1. 創建一個登錄頁面login.jsp
2. 創建一個登錄成功頁面login-success.jsp
3. 創建一個UsernameFilter,來檢查用戶的用戶名是否正確,默認用戶名為admin。
- UsernameFilter要對哪個資源進行過濾?
- 對login-success.jsp的請求進行過濾
檢查用戶名是否為admin
如果是admin,則放行
否則直接轉發回登錄頁面。
4. 創建一個PasswordFilter,用來檢查用戶的密碼是否正確,密碼為123123.
- 攔截發送給login-success.jsp
- 獲取用戶填寫的密碼
判斷密碼是否為123123
如果是123123
則放行
否則直接轉發回登錄頁面。
8、 HttpFilter
仿寫HttpFilter,仿寫和HttpServlet一致!
9、 dispatcher
> Filter默認只會攔截直接向目標資源發送的請求,而像轉發之類的請求不會攔截
> 可以在在filter-mapping的dispatcher標簽中來指定過濾器要攔截的請求類型:
<dispatcher>REQUEST</dispatcher>
代表攔截發送到目標資源的直接請求,如果不指定dispatcher默認值就是request
如果在filter-mapping設置了dispatcher則按照設置的內容來
<dispatcher>FORWARD</dispatcher>
FORWARD代表會攔截通過轉發訪問目標資源的請求。
<dispatcher>INCLUDE</dispatcher>
INCLUDE會攔截通過動態包含訪問目標資源的請求。
<dispatcher>ERROR</dispatcher>
ERROR是攔截在web.xml中聲明的錯誤頁面的
- 我們可以在web.xml文件進行一個錯誤頁面的映射,通過如下標簽:
<error-page>
<error-code>404</error-code>
<location>/4.jsp</location>
</error-page>
error-code指的是發生錯誤的代碼
location 發生錯誤以后去到的頁面
10、 EncodingFilter。
- 項目開發完畢以后,發現項目中出現請求亂碼的問題。
- 這個問題解決起來還是很簡單,只需要在第一次使用request.getParamter()時調用request.setCharacterEncoding("utf-8");即可。
- 但是這行代碼實際在大部分servlet中都需要調用。
- 統一來解決post請求亂碼的問題?
- 創建一個Filter用來過濾所有請求,在Filter將request的編碼設置為utf-8,然后在放行請求。