一直忙着項目功能的開發,對於項目開發中使用中知識點沒有系統的學習總結。今日得閒,看博客的時候看到 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來轉換請求的編碼