Filter可認爲是Servlet的一種“變種”,它主要用於對用戶請求進行預處理,也可以對HttpServletResponse進行後處理,是個典型的處理鏈。它與Servlet的區別在於:它不能直接向用戶生成響應。完整的流程是:Filter對用戶請求進行預處理,接着將請求交給Servlet進行處理並生成響應,最後Filter再對服務器響應進行後處理。
2)servlet、filter、interceptor的執行順序
通過上圖可以看到,順序應該是我們配的filter在前,之後是struts2的FilterDispatcher,然後是各個攔截器,最後原路返回。
filter與servlet:
http://www.cnblogs.com/Fskjb/archive/2010/03/27/1698448.html
filter 與 struts 攔截器
http://bruceyoo.iteye.com/blog/631355
http://jwx0925.iteye.com/blog/631968
Struts2中攔截器與過濾器的執行順序證明:
http://blog.163.com/mail_sv/blog/static/13853926420102295392416/
==============
略多細讀
看Servelt規範:
簡要翻譯下:
filter是一個可以複用的代碼片段,可以用來轉換HTTP請求、響應和頭信息。Filter不像Servlet,它不能產生一個請求或者響應,它只是修改對某一資源的請求,或者修改從某一的響應。
再在看Filter的繼承體系(不繼承Servlet接口):
- public interface Filter
所以第一個結論:Servlet和Filter沒有關係!但是2者可以很好的協同工作。
servlet、filter、interceptor
首先,關於Interceptor。Interceptor是XWork中引入的概念,Struts2的核心是XWork2。Struts2的DispatcherFilter從SerlvetContainer中,獲取到HTTP請求,然後交由內部的Interceptor處理。
Interceptor不是Servlet JSR中的概念。所以Interceptor與其他Filter的執行順序,取決於Struts2的DispatcherFilter與其他Filter的執行順序。
問題變爲: Servlet Filter Struts2的DispatcherFilter的執行順序。
在Servlet JSR中說明了Servlet和Filter執行的順序:
如果一個請求匹配了一個Serlvet,並且該Servlet配置了一個或者多個Filter,毫無疑問,先執行Filter,再執行Servlet。
對與多個匹配的Filter,哪個先執行呢?
JSR中說明的是,按照多個匹配的Filter,是按照其在web.xml中配置的順序來執行的。
所以這也就是,把自己的Filter或者其他的Filter(比如UrlRewrite的Filter)放在Struts的DispatcherFilter的前面的原因。因爲,它們需要在請求被Struts2框架處理之前,做一些前置的工作。
當Filter被調用,並且進入了Struts2的DispatcherFilter中後,Struts2會按照在Action中配置的Interceptor Stack中的Interceptor的順序,來調用Interceptor。
這個流程和以前的 Filter-> Servlet 一樣的。
這個是struts 中最核心的servlet,所有的請求都是通過它。
http://cheng5259.iteye.com/blog/638716