После некоторого исследования и пробной ошибки я нашел метод , который позволил бы мне добавлять фильтры сервлетов программно, сохраняя их порядок по желанию, без использования веб. xml и аннотаций. Основываясь на найденном методе, фильтры не работают, как я понимаю, это представлено картинкой в этой теме . Из моих журналов никогда не выполнялись шаги 5, 6 и 7 цепочки фильтров.
При успешном запуске контекста веб-приложения:
GodFilter.init
Filter1.init
Filter2.init
...
FilterFinal.init
При просмотре веб-приложения:
GodFilter.doFilter
Filter1.doFilter
GodFilterChain.doFilter
Filter2.doFilter
GodFilterChain.doFilter
...
FilterFinal.dofilter
MyServlet.service(ServletRequest request, ServletResponse response)
MyServlet.service(HttpServletRequest request, HttpServletResponse response)
MyServlet.getLastModified
MyServlet.doGet
Как минимум, я ожидаю увидеть GodFilter.doFilter
(для шагов 5, 6 и 7 вызова цепочки фильтров) после MyServlet.doGet
, но он не отображается. Я что-то упустил или неправильно понял, как работает цепочка фильтров сервлета? Неправильный ли класс GodFilter
?
TIA!
[Edit 1]
Я забыл упомянуть, что GodFilter
загружается через класс, реализующий ServletContainerInitializer
:
FilterRegistration fr = context.addFilter(GodFilter.class.getSimpleName(), GodFilter.class);
fr.addMappingForUrlPatterns(EnumSet.of( //
DispatcherType.ASYNC, //
DispatcherType.ERROR, //
DispatcherType.FORWARD, //
DispatcherType.INCLUDE, //
DispatcherType.REQUEST), false, "/*");
fr.setInitParameter("param1", "value1");
Я также пытался isMatchedAfter
в true, но без изменений.