更新時間:2021-11-15 10:43:43 來源:動力節點 瀏覽835次
Javaweb中的過濾器可以攔截所有訪問web資源的請求或響應操作。
當然,我們使用過濾器也是為了處理訪問Servlet的數據。
首先我們來看一下Filter的用法。
1.創建一個類實現Filter接口
2.重寫接口中方法 doFilter方法是真正過濾的。
3.在web.xml文件中配置
下面是實現Filter接口的類
public class TestFilter1 implements Filter{
@Override
public void destroy() {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
// TODO Auto-generated method stub
//請求過濾
System.out.println("我是filter");
chain.doFilter(request, response);
//響應過濾
System.out.println("響應過濾 ");
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
接下來我們需要重寫接口中方法。
第三步呢就是我們需要在web.xml中配置過濾器的路徑。
<filter>
<filter-name>TestFilter1</filter-name>
<filter-class>com.daliyuan.filter.TestFilter1</filter-class>
</filter>
<filter-mapping>
<filter-name>TestFilter1</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
url-pattern中的內容也就是我們需要寫的過濾地址。/*指的是過濾所有頁面。
還有就是我們可以寫確定的訪問地址,比如servlet/Servlet1,這樣的話我們指明確的過濾訪問Servlet1的數據.
還有就是過濾路徑格式是*.name,那么我們就可以過濾所有含有.name結尾的地址了。 格式跟servlet的url地址格式是一樣的。
還有一種格式
<servlet-name>Servlet1</servlet-name>
它是對指定的servlet名稱的servlet進行攔截的。
對于實現的接口的方法,我們下面再來具體看一下。
首先要注意到的就是doFilter方法中的chain參數。 chain的方法doFilter(request, response),它實現的功能就是繼續執行下面的過濾器。
FilterChain 是 servlet 容器為開發人員提供的對象,它提供了對某一資源的已過濾請求調用鏈的視圖。過濾器使用 FilterChain 調用鏈中的下一個過濾器,如果調用的過濾器是鏈中的最后一個過濾器,則調用鏈末尾的資源。
問題:怎樣可以形成一個Filter鏈?
只要多個Filter對同一個資源進行攔截就可以形成Filter鏈
問題:怎樣確定Filter的執行順序?
由<filter-mapping>來確定,也就是xml配置文件的順序。
我們來看一下下面的代碼。
System.out.println("我是過濾器2.....請求");
chain.doFilter(request, response);//去執行下一個過濾器
System.out.println("我是過濾器2.....響應");
----------------------------------------------------
System.out.println("我是過濾器3。。。。。 請求");
chain.doFilter(request, response);//去執行index.jsp
System.out.println("我是過濾器3。。。。。 響應");
例如,這里的兩個過濾器形成了Filter鏈,那么就先執行過濾器2然后過濾器3的請求代碼。
等請求的頁面響應時,是先返回到響應3然后到達響應2
還有一點,我們可能注意到了過濾器中的init方法和destroy方法。
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("=========初始化.....");
}
public void destroy() {
System.out.println("=========銷毀了.....");
}
過濾器在服務器啟動加載的時候就創建了,在服務器關閉的時候銷毀。
Servlet生命周期:
實例化 --》 初始化 --》 服務 --》 銷毀
?當服務器啟動,會創建Filter對象,并調用init方法,只調用一次.
?當訪問資源時,路徑與Filter的攔截路徑匹配,會執行Filter中的doFilter方法,這個方法是真正攔截操作的方法.
?當服務器關閉時,會調用Filter的destroy方法來進行銷毀操作.
我們繼續Filter。
下面我們要看的這個是FilterConfig。這個重要性應該一般。
在Filter的init方法上有一個參數,類型就是FilterConfig.
FilterConfig它是Filter的配置對象,它可以完成下列功能
1.獲取Filter名稱
2.獲取Filter初始化參數
3.獲取ServletContext對象。
我們獲取到的數據是從配置文件獲取的
<filter>
<filter-name>TestFilter5</filter-name>
<filter-class>com.qianfeng.filter.TestFilter5</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
然后呢,FilterConfig是這么用的。
private FilterConfig filterConfig;
public void init(FilterConfig filterConfig) throws ServletException {
this.filterConfig = filterConfig;
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
String encode = filterConfig.getInitParameter("encoding");
//request.setCharacterEncoding(encode);
System.out.println(encode);
chain.doFilter(request, response);
}
GO ON 過濾器。
<dispatcher>
可以取的值有 REQUEST FORWARD ERROR INCLUDE
它的作用是:當以什么方式去訪問web資源時,進行攔截操作.
1.REQUEST 當是從瀏覽器直接訪問資源,或是重定向到某個資源時進行攔截方式配置的 它也是默認值
2.FORWARD 它描述的是請求轉發的攔截方式配置
3.ERROR 如果目標資源是通過聲明式異常處理機制調用時,那么該過濾器將被調用。除此之外,過濾器不會被調用。
4.INCLUDE 如果目標資源是通過RequestDispatcher的include()方法訪問時,那么該過濾器將被調用。除此之外,該過濾器不會被調用
<filter-mapping>
<filter-name>TestFilter6</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
</filter-mapping>
這個是什么用呢。
之前我們每說過,比如當我們訪問一個Servlet1時,Servlet1中有跳轉,這時候我們之前的過濾器就不能發揮作用了。
那么就需要修改過濾器的配置了。
這是我們就需要設置dispatcher屬性了。
上面也具體說明了,有四種取值。
這是我們再用resquest和response跳轉的時候,我們的過濾器就可以攔截了。
Fliter過濾器就說這么多了。
通過上述相信大家對Filter使用方法已經有所了解,大家如果想了解更多相關知識,可以關注一下動力節點的Filter教程,里面的內容通俗易懂,由淺到深,適合小白學習,希望對大家能夠有所幫助。
0基礎 0學費 15天面授
有基礎 直達就業
業余時間 高薪轉行
工作1~3年,加薪神器
工作3~5年,晉升架構
提交申請后,顧問老師會電話與您溝通安排學習