Servlet.init() 和 Filter.init() 的调用顺序

30
在Java Web应用程序中,Servlet.init()和Filter.init()方法的调用顺序是什么?哪一个先被调用?所有Servlet.init()方法在任何Filter.doFilter方法之前都会被调用吗?
4个回答

29

过滤器总是按照在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都会在过滤器初始化之后进行初始化,但在过滤器调用之前进行。

1
如果我在web.xml中设置了load-on-startup,我可以确定这个servlet的init()方法会在任何过滤器的doFilter()方法之前被调用吗? - martsraits
是的,我已经编辑了它。但这与“load-on-startup”无关。 - BalusC
1
@kukudas:不客气。这个相关的答案也可能会有所帮助:https://dev59.com/GnA75IYBdhLWcg3wy8Qi#3106909 - BalusC
@BalusC:过滤器初始化顺序不取决于在web.xml中定义的顺序,正如Jan Gutvirth所指出的那样-在Apache Tomcat 6.0.37上进行了测试。 - Kroky
与@Kroky相同的评论--请参见下面的重要答案:https://dev59.com/k3E85IYBdhLWcg3wLAUV#16237835 - merryreaper

7
  1. 所有过滤器: Filter.init()
  2. 所有在web.xml中带有<load-on-startup>的servlet: Servlet.init()
  3. 对于请求适用的所有过滤器: Filter.doFilter()
  4. 如果适用的servlet尚未初始化: Servlet.init()
  5. 对于适用的servlet: Servlet.service()

1
这与BalusC的答案相矛盾,他的答案会使得(4)在(3)之前发生。 - Robert Tupelo-Schneck
(2)适用于在web.xml中具有load-on-startup的servlet。(4)适用于在第一次请求servlet时初始化的servlet。 - downeyt

6

顺便提一下 - 我在tomcat(7.0.30)上经历过Filter.init()方法随机运行的情况(HashMap迭代)。


这应该是一个注释。 - Nikhil Agrawal
是的,我知道,但由于我的声望不够高,我无法发表评论。但我认为值得一提的是,接受的答案在这个方面似乎是错误的(即调用Filter.init()方法的顺序通常是未定义的)。 - Jan Gutvirth

-1

注意。我目睹了在同一实例上同时调用Filter.init()和Filter.doFilter()的并发情况。我仍然感到震惊,无法恢复。它的名字是Jetty。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接