Фильтр сервлетов не работает должным образом - PullRequest
1 голос
/ 27 февраля 2020

После некоторого исследования и пробной ошибки я нашел метод , который позволил бы мне добавлять фильтры сервлетов программно, сохраняя их порядок по желанию, без использования веб. 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, но без изменений.

1 Ответ

1 голос
/ 27 февраля 2020

Изучив еще немного кода для фильтров, я обнаружил, что упустил важную часть обработки chain.doFilter(request, response) в Filter.doFilter:

Filter1.doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {
    // pre chain processing 

    // if filter is last in filter chain, then mapped servlet will process hereafter
    chain.doFilter(request, response);

    // post chain processing
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...