Интересно, есть ли какая-нибудь аннотация для Filter
класса (для веб-приложений) в Spring Boot? Возможно @Filter
?
Я хочу добавить пользовательский фильтр в свой проект.
Упоминалось о
справочном руководстве по Spring BootFilterRegistrationBean
, но я не уверен, как его использовать.
java
configuration
spring-boot
servlet-filters
janetsmith
источник
источник
Ответы:
Если вы хотите настроить сторонний фильтр, вы можете использовать
FilterRegistrationBean
. Например, эквивалент web.xmlЭто будут две бобы в вашем
@Configuration
файлеВыше был протестирован с пружинной загрузкой 1.2.3
источник
someFilter()
напрямую.Вот пример одного метода включения пользовательского фильтра в приложение Spring Boot MVC. Обязательно включите пакет в проверку компонентов:
источник
MetricsFilter
, но этот компонент будет затенен компонентом исполнительного элемента Spring с тем же именем. Научился этому нелегкому пути ...Специальной аннотации для обозначения фильтра сервлетов не существует. Вы просто объявляете
@Bean
типFilter
(илиFilterRegistrationBean
). Пример (добавление настраиваемого заголовка ко всем ответам) приведен в собственной загрузочной EndpointWebMvcAutoConfiguration ;Если вы только объявите,
Filter
он будет применен ко всем запросам. Если вы также добавите a,FilterRegistrationBean
вы можете дополнительно указать отдельные сервлеты и шаблоны URL для применения.Примечание:
Начиная с Spring Boot 1.4,
FilterRegistrationBean
он не устарел и просто перемещает пакеты изorg.springframework.boot.context.embedded.FilterRegistrationBean
вorg.springframework.boot.web.servlet.FilterRegistrationBean
источник
Filter
на своем classpath. Обычно я просто использовал быspring-boot-starter-web
для извлечения всех соответствующих зависимостей (например, здесь ).Есть три способа добавить свой фильтр,
@Component
@Bean
сFilter
типом весной@Configuration
@Bean
сFilterRegistrationBean
типом весной@Configuration
Либо # 1 или # 2 подойдет, если вы хотите, чтобы ваш фильтр применялся ко всем запросам без настройки, используйте № 3 в противном случае. Вам не нужно указывать компонентное сканирование для # 1, чтобы работать, пока вы помещаете свой класс фильтра в тот же или вложенный пакет вашего
SpringApplication
класса. Для # 3 использование вместе с # 2 необходимо только в том случае, если вы хотите, чтобы Spring управлял вашим классом фильтра, таким как наличие автоматических проводных зависимостей. Это прекрасно работает для меня, чтобы новый мой фильтр, который не нуждается в автопроводке / инжекции зависимостей.Хотя объединение № 2 и № 3 работает нормально, я был удивлен, что в итоге два фильтра не применяются дважды. Я предполагаю, что Spring объединяет два bean-компонента как один, когда вызывает один и тот же метод для создания их обоих. Если вы хотите использовать # 3 в одиночку с автопереходом, вы можете
AutowireCapableBeanFactory
. Ниже приведен пример,источник
Filter
при использованииFilterRegistrationBean
ОБНОВЛЕНИЕ: 2017-12-16:
Есть два простых способа сделать это в Spring Boot 1.5.8.RELEASE, нет необходимости в XML.
Первый способ: если у вас нет пространственного шаблона URL, вы можете использовать @Component следующим образом: (Полный код и подробности здесь https://www.surasint.com/spring-boot-filter/ )
Второй способ: если вы хотите использовать шаблоны URL, вы можете использовать @WebFilter следующим образом: (Полный код и подробности здесь https://www.surasint.com/spring-boot-filter-urlpattern/ )
Но вам также нужно добавить аннотацию @ServletComponentScan в ваш класс @SpringBootApplication:
Обратите внимание, что @Component - это аннотация Spring, а @WebFilter - нет. @WebFilter - это аннотация Servlet 3.
В обоих случаях вам просто нужна базовая зависимость Spring Boot в pom.xml (нет необходимости в явном встроенном в tascat jasper)
ПРЕДУПРЕЖДЕНИЕ: Во-первых, если контроллер в Spring Boot возвращается в файл JSP, запрос дважды проходит фильтр.
Хотя, во-вторых, запрос пройдет фильтр только один раз.
Я предпочитаю второй способ, потому что он больше похож на поведение по умолчанию в спецификации сервлета ( https://docs.oracle.com/cd/E19879-01/819-3669/6n5sg7b0b/index.html )
Вы можете увидеть больше журнала испытаний здесь https://www.surasint.com/spring-boot-webfilter-instead-of-component/
источник
Filter
интерфейс вызывался много раз во время запуска applicationContext. Есть ли способ выполнить его только один раз?Вот пример моего пользовательского класса Filter:
И я добавил его в конфигурацию загрузки Spring, добавив его в класс Configuration следующим образом:
источник
Из весенних документов,
Встроенные контейнеры сервлетов - добавление сервлета, фильтра или прослушивателя в приложение
Например:
Добавьте этот
@Bean
конфиг в ваш@Configuration
класс, и фильтр будет зарегистрирован при запуске.Также вы можете добавлять сервлеты, фильтры и прослушиватели, используя сканирование пути к классам,
источник
Если вы используете Spring Boot + Spring Security, вы можете сделать это в конфигурации безопасности.
В приведенном ниже примере я добавляю пользовательский фильтр перед именем UsernamePasswordAuthenticationFilter (см. Все фильтры Spring Security по умолчанию и их порядок ).
И класс фильтра
источник
Используя аннотацию @WebFilter, это можно сделать следующим образом:
источник
У нас есть примерно четыре различных варианта регистрации фильтра с помощью Spring .
Во-первых, мы можем создать bean-компонент Spring, реализующий Filter или расширяющий HttpFilter :
Во-вторых, мы можем создать бин Spring, расширяющий GenericFilterBean :
В качестве альтернативы мы можем использовать класс FilterRegistrationBean :
И , наконец , мы можем использовать @WebFilter аннотацию с @ServletComponentScan :
источник
Это скорее совет, чем ответ, но если вы используете Spring MVC в своем веб-приложении, хорошая идея - использовать Spring HandlerInterceptor вместо Filter
Он может выполнять ту же работу, но также - Может работать с ModelAndView - Его методы можно вызывать до и после обработки запроса или после завершения запроса.
- Это может быть легко проверено
1 Реализуйте интерфейс HandlerInterceptor и добавьте аннотацию @Component в свой класс
2 Настройте ваш перехватчик
источник
Этот фильтр также поможет вам разрешить перекрестный доступ
источник
Вы можете использовать @WebFilter javax.servlet.annotation.WebFilter в классе, который реализует javax.servlet.Filter.
Затем используйте @ServletComponentScan для регистрации
источник
Я видел много ответов здесь, но я не пробовал ни одного из них. Я только что создал фильтр, как в следующем коде.
И оставил оставшееся приложение Spring Boot как есть.
источник
Вам нужно 2 основных вещи: - Добавить
@ServletComponentScan
в свой основной класс - вы можете добавить пакет с именем filter внутри него, вы создаетеFilter
класс, который имеет следующее:источник
Вы также можете сделать фильтр с помощью @WebFilter и реализовать фильтр, это будет делать.
источник
Фильтры, как следует из названия, используются для выполнения фильтрации либо запроса к ресурсу, либо ответа от ресурса, либо обоих. Spring Boot предоставляет несколько опций для регистрации пользовательских фильтров в приложении Spring Boot. Давайте посмотрим на разные варианты.
1. Определите весенний загрузочный фильтр и порядок вызова
Внедрите интерфейс Filter для создания нового фильтра в Spring Boot.
Давайте быстро посмотрим на некоторые важные моменты в приведенном выше коде
Для запуска фильтров в правильном порядке - нам нужно было использовать аннотацию @Order .
В приведенном выше коде CustomFirstFilter будет работать до CustomSecondFilter.
2. Шаблон URL
Если основанное на соглашении отображение недостаточно гибкое, мы можем использовать FilterRegistrationBean для полного контроля над приложением. Здесь не используйте аннотацию @Component для класса фильтра, но зарегистрируйте фильтр с помощью FilterRegistrationBean .
Зарегистрируйте пользовательский фильтр с помощью FilterRegistrationBean .
источник
Вы должны реализовать фильтр и должны быть аннотированы @WebFilter (urlPatterns = "/ *")
А в классе Application или Configuration вам нужно добавить @ServletComponentScan. Таким образом, ваш фильтр будет зарегистрирован.
источник
@WebFilter
только начиная с Servlet 3.0. Так что он может не работать должным образом для 2.5Шаг 1. Создайте компонент фильтра с помощью интерфейса фильтра.
Шаг 2: Установите этот фильтр на шаблоны URI, используя FilterRegistrationBean.
Вы можете обратиться по этой ссылке для полного применения.
источник
Сначала добавьте
@ServletComponentScan
в свой класс SpringBootApplication.Во-вторых, создайте файл фильтра, расширяющий класс Filter или сторонний класс фильтра, и добавьте
@WebFilter
в этот файл:источник
Я видел ответ от Василия Комарова. Аналогичный подход, но с использованием абстрактного класса HandlerInterceptorAdapter вместо использования HandlerInterceptor .
Вот пример ...
источник
Как вы все знаете, Spring Boot - это прекрасный способ разработки WebApp или StandaloneApp с минимальной конфигурацией и продуманной настройкой.
Так я добился разработки веб-фильтра в Spring Boot.
Версия 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.
Чтобы развернуть Spring Boot Application как «Традиционную WAR», класс приложения должен расширять SpringBootServletInitializer.
ПРИМЕЧАНИЕ :: SpringBootServletInitializer - это «программная реализация» файла web.xml со ссылкой на спецификации Servlet 3.0+, для которых требуется реализация WebApplicationInitializer.
Таким образом, SpringBootApplication не требует "web.xml", так как его класс Application (после расширения SpringBootServletInitializer) сканирует для
- @WebFilter,
- @WebListener и
- @WebServlet.
Эта аннотация позволяет сканировать базовые пакеты для веб-компонентов, аннотированных @WebFilter, @WebListener и @WebServlet.
В связи с тем, что встроенные контейнеры не поддерживают аннотации @WebServlet, @WebFilter и @WebListener, Spring Boot, в значительной степени опираясь на встроенные контейнеры, представил эту новую аннотацию @ServletComponentScan для поддержки некоторых зависимых jar-файлов, которые используют эти 3 аннотации.
Сканирование выполняется только при использовании встроенного контейнера сервлетов.
Здесь: я определил пользовательский класс: «ServletInitializer», который расширяет класс: SpringBootServletInitializer.
Как объяснялось ранее, SpringBootServletInitializer отвечает за сканирование аннотаций:
- @WebFilter,
@WebListener и
- @WebServlet.
И, следовательно, класс приложения Spring Boot должен
источник
Фильтры в основном используются в файлах логгеров, они различаются в зависимости от логгера, который вы используете в проекте Lemme объяснение для log4j2:
Фильтры используются для ограничения данных, и я использовал пороговый фильтр для ограничения уровней данных в потоке. Я упомянул уровни, которые могут быть там ограничены. Для дальнейшего использования см. Порядок уровней log4j2 - Log4J Levels: ALL> TRACE> DEBUG> INFO> WARN> ERROR> FATAL> OFF
источник
FilterRegistrationBean
как уже упоминалось в вопросеjavax.servlet.Filter
, этот ответ говорит оorg.apache.logging.log4j.core.Filter