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

2022-09-01 10:48:36

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


答案 1

在 Web 应用启动期间,筛选器始终按照中定义的顺序进行初始化。web.xml

默认情况下,servlet 仅在其 url 模式的第一个 HTTP 请求期间初始化。但是,您也可以使用它们配置为在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 的加载顺序是未指定的,并且可能是任意的。但是,Servlet 以任何方式在过滤器初始化之后,但在调用过滤器之前进行初始化。


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

推荐