listener跟filter

版權聲明:本文爲博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/xionghuilin123/article/details/51074575

  一直忙着項目功能的開發,對於項目開發中使用中知識點沒有系統的學習總結。今日得閒,看博客的時候看到 listener跟filter。想到之前朋友去面試,面試官問過這樣一個問題。

知道listener跟filter嗎?知道。瞭解他們的底層實現嗎。嗯............。  很多情況下,我們對知識都只是一知半解,知道怎麼使用,而不清楚怎麼實現的。下面說一說我自己的見解,有什麼理解不清楚的地方,還望各位指點跟拍磚!!!!!

  listener跟filter都屬於servlet體系,兩者用途不同,所以實現方式也不一樣。

 listener:監聽器。一般在web開發,在web.xml配置我們所需要的listener

<listener><listener-class>xxxxxx</listener-class></listener>  查看源碼不難發現所有listener類都間接或直接實現interface EventListener 。EventListener中沒有初始方法。

該類的作用只是告訴servlet容器這是一個listener。我們常用的有HttpSessionListener  有兩個方法 sessionCreate ,SessionDestory。

filter:過濾器。在web.xml配置我們所需的filter不是 針對對應的url-mapping

<filter>

<filter-name>xxxxx</filter-name>

<filter-class>xxxx</filter-class>

<init-param>
<param-name>xxx</param-name>
<param-value>xxx</param-value>
</init-param>

</filter>

<filter-mapping>

        <filter-name>xxx</filter-name>

<url-pattern>xxx</url-pattern>

</filter-mapping>

<init-param>可以要,可以不要。

所有的filter都實現interface Filter

public interface Filter {

public void init(FilterConfig filterConfig) throws ServletException;


       public void doFilter ( ServletRequest request, ServletResponse response, FilterChain chain ) throws IOException, ServletException;


public void destroy();

}

可以看到默認聲明三個方法

這個三個方法執行的順序是 ,當servlet啓動的時候會初始化init    filter 客戶端有請求的時候我們執行dofilter,  destory()銷燬改servlet

filter功能,它使用戶可以改變一個 request和修改一個response. Filter 不是一個servlet,它不能產生一個response,它能夠在一個request到達servlet之前預處理request,也可以在離開 servlet時處理response.換種說法,filter其實是一個”servlet chaining”(servlet 鏈).

一個Filter包括:

1)、在servlet被調用之前截獲;

2)、在servlet被調用之前檢查servlet request;

3)、根據需要修改request頭和request數據;

4)、根據需要修改response頭和response數據;

5)、在servlet被調用之後截獲.

 服務器每次只調用setFilterConfig方法一次準備filter 的處理;調用doFilter方法多次以處理不同的請求.FilterConfig接口有方法可以找到filter名字及初始化參數信息.服務器可以設置 FilterConfig爲空來指明filter已經終結。

每一個filter從doFilter()方法中得到當前的request及response.在這個方法裏,可以進行任何的針對request及 response的操作.(包括收集數據,包裝數據等).filter調用chain.doFilter()方法把控制權交給下一個filter.一個 filter在doFilter()方法中結束.如果一個filter想停止request處理而獲得對response的完全的控制,那它可以不調用下 一個filter。

可以通過filter來轉換請求的編碼


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章