Filter是一個很有用的東西,使用filter可以修改request, response, session, application中的內容。
1. javax.servlet.Filter有兩個重要的方法
public void init(FilterConfig config)
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
其中init方法用來作一些初始化的方法,而doFilter方法用來執行真正的過濾操作。
2. Filter的部署方法
在web.xml中要聲明filter元素,並分配需要其處理的url,如下:
<filter>
<filter-name>Filter1</filter-name>
<filter-class>com.baidu.Filter1</filter-class>
</filter>
<filter>
<filter-name>Filter2</filter-name>
<filter-class>com.baidu.Filter2</filter-class>
</filter>
<filter-mapping>
<filter-name>Filter1</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>Filter2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
3. doFilter函數的執行順序
當某個url請求匹配了多個Filter時,應用伺服器將多個Filter組織成FilterChain,這個鏈的執行順序是由其<filter-mapping>元素在web.xml檔案中的順序決定的。
doFilter函數可以過濾請求或者響應,當其過濾完請求後將調用FilterChain的doFilter函數讓FilterChain中的下一個Filter來過濾請求。最先過濾請求的Filter將最後過濾相應,下面是個簡單的例子。
public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException
{
system.out.println(“filter request here ----”);
// todo:
chain.doFilter(request,response);
system.out.println(“filter response here ----”);
// todo:
}
4.init函數的執行順序
對於不同的應用伺服器,Filter的init函數的執行時間是不同的,例如:tomcat會在tomcat啟動的時候執行init函數,而weblogic等一些其他的應用伺服器則會在該Filter匹配的url被首次請求的時候載入。
(下面的部分是我通過實驗猜想的,不一定正確。)
對於tomcat而言,tomcat啟動時會解析web.xml檔案,然後按照<filter>元素的順序將各個Filter元素載入到一個 HashMap中。解析完成後,會從HashMap中一個個的拿出Filter元素,串列的執行其init函數(這裡的執行有先後關係,是在一個線程中執 行的)。所以在tomcat中定義的多個Filter其init函數的執行順序就是其在HashMap中的散列順序,具體來說與其在web.xml檔案中 的定義位置及其名字有關。
對於HashMap來說,如果其元素固定不變,則其順序也是固定不變的,但當元素個數發生變化時,便不能保證其順序(例如:當有兩個元素時,A在B的前面,當再加入20個元素的時候A就不一定在B的前面了),所以init函數的執行順序是無法保證的。