Последовательность вызовов Servlet.init () и Filter.init () - PullRequest
31 голосов
/ 25 мая 2010

В каком порядке вызываются методы Servlet.init () и Filter.init () в веб-приложении Java? Какой из них называется первым? Все ли методы Servlet.init () вызваны раньше, чем какой-либо метод Filter.doFilter?

Ответы [ 4 ]

28 голосов
/ 25 мая 2010

Фильтры всегда инициализируются при запуске веб-приложения в порядке, определенном в web.xml.

Сервлеты по умолчанию инициализируются во время первого HTTP-запроса только по их URL-шаблону. Но вы также можете настроить их для инициализации во время запуска веб-приложения, используя записи <load-on-startup>, в которых вы можете указать их приоритет. Затем они будут загружены в порядке приоритета.
Э.Г.

<servlet>
    <servlet-name>myServlet</servlet-name>
    <servlet-class>mypackage.MyServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>

Если существует больше сервлетов с таким же порядком приоритета, то порядок загрузки этих сервлетов не указан и может быть произвольным. Однако сервлеты каким-либо образом инициализируются после инициализации фильтров, но до вызова фильтров.

8 голосов
/ 25 мая 2010
  1. Для всех фильтров: Filter.init()
  2. Для всех сервлетов с '' в web.xml: Servlet.init()
  3. Для всех применимых фильтров по запросу: Filter.doFilter()
  4. Если применимо, сервлет еще не инициализирован: Servlet.init()
  5. Для применимого сервлета: Servlet.service()
7 голосов
/ 26 апреля 2013

Еще одно замечание: на tomcat (7.0.30) я обнаружил, что методы Filter.init () запускаются в случайном порядке (итерация по HashMap).

0 голосов
/ 30 апреля 2017

Осторожно. Я был свидетелем одновременного вызова Filter.init () и Filter.doFilter () в одном экземпляре. Я все еще в шоке и не могу прийти в себя. Его зовут Причал.

...