Как вы все знаете, Spring Boot - это прекрасный способ разработки WebApp или StandaloneApp с минимальной конфигурацией и продуманной настройкой.
Так я добился разработки веб-фильтра в Spring Boot.
My SpringBootApp Технические характеристики: -
Версия Spring Boot: 2.0.4.RELEASE
Версия Java: 8.0
Servlet Спецификация: Servlet 3.0 (обязательно и важно)
Я объявил свой веб-фильтр следующим образом, придерживаясь спецификаций сервлета 3.0
Это программный способ определения фильтра как замены определений на основе web.xml.
Аннотация @Webfilter будет обрабатываться контейнером во время развертывания, класс Filter, в котором он найден, будет создан в соответствии с конфигурацией и применен к шаблонам URL, javax.servlet.Servlets и javax.servlet.DispatcherTypes.
Чтобы полностью избежать Web.xml и добиться «Deployable» WebApp: -
Чтобы развернуть Spring Boot Application как «Традиционную WAR», класс приложения должен расширять SpringBootServletInitializer.
ПРИМЕЧАНИЕ ::
SpringBootServletInitializer - это «программная реализация» файла web.xml со ссылкой на спецификации Servlet 3.0+, для которых требуется реализация WebApplicationInitializer.
Таким образом, SpringBootApplication не требует "web.xml", так как его класс Application (после расширения SpringBootServletInitializer) сканирует для
- @WebFilter,
- @WebListener и
- @WebServlet.
Аннотация @ServletComponentScan
Эта аннотация позволяет сканировать базовые пакеты для веб-компонентов, аннотированных @WebFilter, @WebListener и @WebServlet.
В связи с тем, что встроенные контейнеры не поддерживают аннотации @WebServlet, @WebFilter и @WebListener, Spring Boot, в значительной степени опираясь на встроенные контейнеры, представил эту новую аннотацию @ServletComponentScan для поддержки некоторых зависимых jar-файлов, которые используют эти 3 аннотации.
Сканирование выполняется только при использовании встроенного контейнера сервлетов.
Ниже приведено определение класса приложения Spring Boot: -
Пользовательский инициализатор сервлета: -
Здесь: я определил пользовательский класс: «ServletInitializer», который расширяет класс: SpringBootServletInitializer.
Как объяснялось ранее, SpringBootServletInitializer отвечает за сканирование аннотаций:
- @WebFilter,
@WebListener и
- @WebServlet.
И, следовательно, класс приложения Spring Boot должен
- Либо расширить класс: SpringBootServletInitializer ИЛИ
- расширить пользовательский класс, который расширяет класс: SpringBootServletInitializer