Java Servlet.init()和Filter.init()调用序列

Java Servlet.init()和Filter.init()调用序列,java,servlets,jakarta-ee,servlet-filters,Java,Servlets,Jakarta Ee,Servlet Filters,java web应用程序中调用Servlet.init()和Filter.init()方法的顺序是什么?哪一个是第一个?是否所有Servlet.init()方法都比任何Filter.doFilter方法调用得更早?在webapp启动期间,过滤器总是按照web.xml中定义的顺序初始化 默认情况下,servlet仅在其url模式的第一个HTTP请求期间初始化。但您也可以使用条目将它们配置为在webapp启动期间初始化,您可以在其中指定它们的优先级。然后将按优先级顺序加载它们。 例如 myServ

java web应用程序中调用Servlet.init()和Filter.init()方法的顺序是什么?哪一个是第一个?是否所有Servlet.init()方法都比任何Filter.doFilter方法调用得更早?

在webapp启动期间,过滤器总是按照
web.xml
中定义的顺序初始化

默认情况下,servlet仅在其url模式的第一个HTTP请求期间初始化。但您也可以使用
条目将它们配置为在webapp启动期间初始化,您可以在其中指定它们的优先级。然后将按优先级顺序加载它们。
例如


myServlet
mypackage.MyServlet
1.
如果有更多具有相同优先级顺序的servlet,那么这些servlet的加载顺序是未指定的,可能是任意的。然而,servlet在初始化过滤器之后,但在调用过滤器之前以任何方式初始化

  • 对于所有筛选器:
    Filter.init()
  • 对于在
    web.xml
    中具有
    的所有Servlet:
    Servlet.init()
  • 对于请求的所有适用筛选器:
    Filter.doFilter()
  • 如果适用,servlet尚未初始化:
    servlet.init()
  • 对于适用的servlet:
    servlet.service()

  • 我在tomcat(7.0.30)上体验到Filter.init()方法是以随机顺序运行的(在HashMap上迭代)。

    小心。我已经看到在同一个实例上并发调用Filter.init()和Filter.doFilter()。我仍然感到震惊,无法恢复。它的名字叫Jetty

    如果我在web.xml中设置了启动时加载,我是否可以确定在任何过滤器的doFilter之前调用了这个servlet的init()。不过,这与启动时加载无关。@kukudas:不客气。这个相关的答案也可能有帮助:@BalusC:filter initilization的顺序并不取决于Jan Gutvirth指出的web.xml中定义的顺序——在Apache Tomcat 6.0.37上进行测试,与@Kroky的评论相同——请参见下面的重要答案:这与BalusC的答案相矛盾,您的(4)发生在(3)之前用于web.xml中启动时加载的servlet。(4) 是针对第一次请求servlet时初始化的servlet的。这应该是一个注释。是的,我知道,但我不能注释,因为我没有足够的声誉。但我认为值得一提的是,公认的答案在这方面似乎是错误的(即调用Filter.init()方法的顺序通常是未定义的)
    <servlet>
        <servlet-name>myServlet</servlet-name>
        <servlet-class>mypackage.MyServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>