Filter是一個很有用的東西,使用filter可以修改request, response, session, application中的內(nèi)容。
1. javax.servlet.Filter有兩個重要的方法
public void init(FilterConfig config)
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain)
其中init方法用來作一些初始化的方法,而doFilter方法用來執(zhí)行真正的過濾操作。
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函數(shù)的執(zhí)行順序
當(dāng)某個url請求匹配了多個Filter時,應(yīng)用服務(wù)器將多個Filter組織成FilterChain,這個鏈的執(zhí)行順序是由其<filter-mapping>元素在web.xml文件中的順序決定的。
doFilter函數(shù)可以過濾請求或者響應(yīng),當(dāng)其過濾完請求后將調(diào)用FilterChain的doFilter函數(shù)讓FilterChain中的下一個Filter來過濾請求。最先過濾請求的Filter將最后過濾相應(yīng),下面是個簡單的例子。
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函數(shù)的執(zhí)行順序
對于不同的應(yīng)用服務(wù)器,F(xiàn)ilter的init函數(shù)的執(zhí)行時間是不同的,例如:tomcat會在tomcat啟動的時候執(zhí)行init函數(shù),而weblogic等一些其他的應(yīng)用服務(wù)器則會在該Filter匹配的url被首次請求的時候加載。
(下面的部分是我通過實驗猜想的,不一定正確。)
對于tomcat而言,tomcat啟動時會解析web.xml文件,然后按照<filter>元素的順序?qū)⒏鱾€Filter元素加載到一個 HashMap中。解析完成后,會從HashMap中一個個的拿出Filter元素,串行的執(zhí)行其init函數(shù)(這里的執(zhí)行有先后關(guān)系,是在一個線程中執(zhí) 行的)。所以在tomcat中定義的多個Filter其init函數(shù)的執(zhí)行順序就是其在HashMap中的散列順序,具體來說與其在web.xml文件中 的定義位置及其名字有關(guān)。
對于HashMap來說,如果其元素固定不變,則其順序也是固定不變的,但當(dāng)元素個數(shù)發(fā)生變化時,便不能保證其順序(例如:當(dāng)有兩個元素時,A在B的前面,當(dāng)再加入20個元素的時候A就不一定在B的前面了),所以init函數(shù)的執(zhí)行順序是無法保證的。
其中init方法用來作一些初始化的方法,而doFilter方法用來執(zhí)行真正的過濾操作。
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函數(shù)的執(zhí)行順序
當(dāng)某個url請求匹配了多個Filter時,應(yīng)用服務(wù)器將多個Filter組織成FilterChain,這個鏈的執(zhí)行順序是由其<filter-mapping>元素在web.xml文件中的順序決定的。
doFilter函數(shù)可以過濾請求或者響應(yīng),當(dāng)其過濾完請求后將調(diào)用FilterChain的doFilter函數(shù)讓FilterChain中的下一個Filter來過濾請求。最先過濾請求的Filter將最后過濾相應(yīng),下面是個簡單的例子。
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函數(shù)的執(zhí)行順序
對于不同的應(yīng)用服務(wù)器,F(xiàn)ilter的init函數(shù)的執(zhí)行時間是不同的,例如:tomcat會在tomcat啟動的時候執(zhí)行init函數(shù),而weblogic等一些其他的應(yīng)用服務(wù)器則會在該Filter匹配的url被首次請求的時候加載。
(下面的部分是我通過實驗猜想的,不一定正確。)
對于tomcat而言,tomcat啟動時會解析web.xml文件,然后按照<filter>元素的順序?qū)⒏鱾€Filter元素加載到一個 HashMap中。解析完成后,會從HashMap中一個個的拿出Filter元素,串行的執(zhí)行其init函數(shù)(這里的執(zhí)行有先后關(guān)系,是在一個線程中執(zhí) 行的)。所以在tomcat中定義的多個Filter其init函數(shù)的執(zhí)行順序就是其在HashMap中的散列順序,具體來說與其在web.xml文件中 的定義位置及其名字有關(guān)。
對于HashMap來說,如果其元素固定不變,則其順序也是固定不變的,但當(dāng)元素個數(shù)發(fā)生變化時,便不能保證其順序(例如:當(dāng)有兩個元素時,A在B的前面,當(dāng)再加入20個元素的時候A就不一定在B的前面了),所以init函數(shù)的執(zhí)行順序是無法保證的。