天天看點

[轉]servlet 和filter差別和servlet、filter、interceptor的執行順序

1)servlet和filter的差別

Filter可認為是Servlet的一種“變種”,它主要用于對使用者請求進行預處理,也可以對HttpServletResponse進行後處 理,是個典型的處理鍊。它與Servlet的差別在于:它不能直接向使用者生成響應。完整的流程是:Filter對使用者請求進行預處理,接着将請求交給Servlet進行處理并生成響應,最後Filter再對伺服器響應進行後處理。

2)servlet、filter、interceptor的執行順序

[轉]servlet 和filter差別和servlet、filter、interceptor的執行順序

通過上圖可以看到,順序應該是我們配的filter在前,之後是struts2的FilterDispatcher,然後是各個攔截器,最後原路 傳回。 cwx714 (資深程式員) 2010-05-10

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/

引用 servlet和filter有什麼差別

看Servelt規範:

引用 A filter is a reusable piece of code that can transform the content of HTTP requests, responses, and header information. Filters do not generally create a response or respond to a request as servlets do, rather they modify or adapt the requests for a resource, and modify or adapt responses from a resource.

簡要翻譯下:

filter是一個可以複用的代碼片段,可以用來轉換HTTP請求、響應和頭資訊。Filter不像Servlet,它不能産生一個請求或者響 應,它隻是修改對某一資源的請求,或者修改從某一的響應。

再在看Filter的繼承體系(不繼承Servlet接口):

Java代碼

  1. public interface Filter

Java代碼

[轉]servlet 和filter差別和servlet、filter、interceptor的執行順序
[轉]servlet 和filter差別和servlet、filter、interceptor的執行順序
[轉]servlet 和filter差別和servlet、filter、interceptor的執行順序

是以第一個結論: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。

轉自:http://www.iteye.com/problems/41978