在Java Web应用程序中,Servlet.init()和Filter.init()方法的调用顺序是什么?哪一个先被调用?所有Servlet.init()方法在任何Filter.doFilter方法之前都会被调用吗?
过滤器总是按照在web.xml
中定义的顺序在web应用程序启动期间进行初始化。
Servlet默认情况下仅在其url-pattern上收到第一次HTTP请求时初始化。但您也可以使用<load-on-startup>
条目将它们配置为在Web应用程序启动期间初始化,其中您可以指定它们的优先级。然后它们将按优先级顺序加载。
例如:
<servlet>
<servlet-name>myServlet</servlet-name>
<servlet-class>mypackage.MyServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
如果有多个具有相同优先级顺序的Servlet,则这些Servlet的加载顺序未指定并且可能是任意的。然而无论如何,Servlet都会在过滤器初始化之后进行初始化,但在过滤器调用之前进行。Filter.init()
web.xml
中带有<load-on-startup>
的servlet: Servlet.init()
Filter.doFilter()
Servlet.init()
Servlet.service()
顺便提一下 - 我在tomcat(7.0.30)上经历过Filter.init()方法随机运行的情况(HashMap迭代)。
注意。我目睹了在同一实例上同时调用Filter.init()和Filter.doFilter()的并发情况。我仍然感到震惊,无法恢复。它的名字是Jetty。