2010-05-25 36 views

回答

25

在webapp的啓動過程中,過濾器始終按照web.xml中定義的順序進行初始化。

servlet在第一個HTTP請求期間僅在其url模式下默認初始化。但是,您也可以配置它們以在webapp啓動時使用<load-on-startup>條目進行初始化,您可以在其中指定它們的優先級。然後它們將按照優先順序加載。
例如

<servlet> 
    <servlet-name>myServlet</servlet-name> 
    <servlet-class>mypackage.MyServlet</servlet-class> 
    <load-on-startup>1</load-on-startup> 
</servlet> 

如果有更多的servlet具有相同的優先級順序,那麼這些servlet的加載順序是未指定的,可能是任意的。然而Servlets在之後初始化過濾器的初始化,但之前調用過濾器。

+1

如果我在web.xml中設置了load-on-startup,我可以確定在任何過濾器的doFilter之前調用了此servlet的init()嗎? – martsraits 2010-05-25 16:30:01

+0

是的,我編輯了它。然而,這與「加載啓動」無關。 – BalusC 2010-05-25 16:31:43

+0

+1對thx很有幫助。 – kukudas 2011-04-12 14:43:53

6
  1. 所有濾鏡:Filter.init()
  2. 對於'所有servlet在web.xmlServlet.init()
  3. 爲要求所有適用的過濾器:Filter.doFilter()
  4. 如果適用的servlet尚未初始化:Servlet.init()
  5. 對於適用的servlet:Servlet.service()
+1

This與BalusC的答案相矛盾,這會讓你的(4)在(3)之前發生。 – 2012-09-06 20:20:29

+0

(2)適用於web.xml中具有啓動時加載的servlet。 (4)用於在首次請求servlet時初始化的servlet。 – downeyt 2015-07-14 23:50:28

6

只是一個方面說明 - 我經歷了在Tomcat(7.0.30)的Filter.init()方法以隨機順序(遍歷所有的HashMap)運行。

+0

這應該是一條評論。 – 2013-04-26 13:54:59

+0

是的,我知道,但我不能評論,因爲我沒有足夠的聲譽。但我認爲值得一提的是,接受的答案在這方面似乎是錯誤的(即調用Filter.init()方法的順序通常是未定義的) – 2013-04-29 13:45:20

-1

請注意。我一直在見證在同一個實例上同時調用Filter.init()和Filter.doFilter()。我仍然感到震驚,無法恢復。它的名字是Jetty。

相關問題