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

在java Web应用程序中调用的Servlet.init()和Filter.init()方法的顺序是什么? 首先叫哪一个? 是否所有Servlet.init()方法都被调用,而不是任何Filter.doFilter方法?

在webapp启动期间,始终按照web.xml中定义的顺序初始化filter。

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

  myServlet mypackage.MyServlet 1  

如果有更多具有相同优先级顺序的servlet,那么这些servlet的加载顺序是未指定的,可能是任意的。 但是,在filter初始化之后 ,但调用filter之前 ,Servlet会以任何方式进行初始化。

  1. 对于所有filter: Filter.init()
  2. 对于web.xml带有”的所有servlet: Servlet.init()
  3. 对于请求的所有适用filter: Filter.doFilter()
  4. 如果适用的servlet尚未初始化: Servlet.init()
  5. 对于适用的servlet: Servlet.service()

只是旁注 – 我在tomcat(7.0.30)上经历了Filter.init()方法以随机顺序运行(通过HashMap迭代)。

谨防。 我一直在见证同一个实例上的Filter.init()和Filter.doFilter()的并发调用。 我仍然感到震惊,无法恢复。 它的名字是Jetty。