Zastanawiam się, czy Filter
w Spring Boot jest jakaś adnotacja dla klasy (dla aplikacji internetowych)? Być może @Filter
?
Chcę dodać niestandardowy filtr do mojego projektu.
W Poradniku Spring Boot wspomniano o
FilterRegistrationBean
, ale nie jestem pewien, jak go używać.
java
configuration
spring-boot
servlet-filters
Janetsmith
źródło
źródło
Odpowiedzi:
Jeśli chcesz skonfigurować filtr innej firmy, możesz użyć
FilterRegistrationBean
. Na przykład odpowiednik pliku web.xmlTo będą dwie fasole w twoim
@Configuration
plikuPowyższe zostało przetestowane w wersji Spring-boot 1.2.3
źródło
someFilter()
bezpośrednio.Oto przykład jednej metody włączenia niestandardowego filtra do aplikacji Spring Boot MVC. Pamiętaj o dołączeniu pakietu do skanu składników:
źródło
MetricsFilter
, ale ta fasola zostanie przyćmiona przez komponent Spring Spring o tej samej nazwie. Nauczyłem się tego naNie ma specjalnej adnotacji oznaczającej filtr serwletu. Po prostu deklarujesz
@Bean
typFilter
(lubFilterRegistrationBean
). Przykład (dodanie niestandardowego nagłówka do wszystkich odpowiedzi) znajduje się w EndpointWebMvcAutoConfiguration Boota ;Jeśli zadeklarujesz tylko
Filter
, będzie on stosowany do wszystkich wniosków. Jeśli dodasz równieżFilterRegistrationBean
, możesz dodatkowo określić indywidualne serwlety i wzorce adresów URL do zastosowania.Uwaga:
Począwszy od Spring Boot 1.4,
FilterRegistrationBean
nie jest przestarzałe i po prostu przenosi pakiety zorg.springframework.boot.context.embedded.FilterRegistrationBean
doorg.springframework.boot.web.servlet.FilterRegistrationBean
źródło
Filter
na swojej ścieżce klas. Zwykle używałbym tego,spring-boot-starter-web
aby pobrać wszystkie odpowiednie zależności (np. Tutaj ).Istnieją trzy sposoby dodania filtra:
@Component
@Bean
zFilter
typem na wiosnę@Configuration
@Bean
zFilterRegistrationBean
typem na wiosnę@Configuration
Zrobisz # 1 lub # 2, jeśli chcesz, aby Twój filtr dotyczył wszystkich żądań bez dostosowywania, użyj # 3 w przeciwnym razie. Nie musisz określać skanowania komponentu dla nr 1, aby działał, dopóki umieścisz klasę filtra w tym samym lub paczce swojej
SpringApplication
klasy. W przypadku # 3 użycie razem z # 2 jest konieczne tylko wtedy, gdy chcesz, aby Spring zarządzał klasą filtrów, na przykład automatycznie włączał zależności. Działa dobrze dla mnie, aby nowy filtr, który nie wymaga żadnej zależności / automatycznego uruchamiania / wstrzykiwania.Chociaż połączenie nr 2 i nr 3 działa dobrze, byłem zaskoczony, że nie kończy się to na zastosowaniu dwóch filtrów dwa razy. Domyślam się, że Spring łączy dwie fasole jako jedną, gdy wywołuje tę samą metodę, aby utworzyć obie. Jeśli chcesz korzystać z samego # 3 z autouruchamianiem, możesz
AutowireCapableBeanFactory
. Oto przykładźródło
Filter
podczas korzystaniaFilterRegistrationBean
AKTUALIZACJA: 16.12.2017:
Są dwa proste sposoby, aby to zrobić w Spring Boot 1.5.8. UWOLNIENIE, bez potrzeby XML.
Pierwszy sposób: jeśli nie masz żadnego spacjalnego wzorca adresu URL, możesz użyć @Component w ten sposób: (Pełny kod i szczegóły są tutaj https://www.surasint.com/spring-boot-filter/ )
Drugi sposób: jeśli chcesz używać wzorców adresów URL, możesz użyć @WebFilter w następujący sposób: (Pełny kod i szczegóły są tutaj https://www.surasint.com/spring-boot-filter-urlpattern/ )
Ale musisz również dodać adnotację @ServletComponentScan w swojej klasie @SpringBootApplication:
Zauważ, że @Component jest adnotacją Springa, ale @WebFilter nie jest. @WebFilter jest adnotacją Servlet 3.
Oba sposoby, potrzebujesz tylko podstawowej zależności Spring Boot w pom.xml (nie potrzebujesz jawnego osadzonego tomcat jasper)
OSTRZEŻENIE: Pierwszy sposób, jeśli kontroler w Spring Boot powróci do pliku JSP, żądanie przejdzie filtr dwukrotnie.
Podczas gdy w drugi sposób żądanie przejdzie filtr tylko raz.
Wolę drugi sposób, ponieważ jest bardziej podobny do domyślnego zachowania w specyfikacji serwletu ( https://docs.oracle.com/cd/E19879-01/819-3669/6n5sg7b0b/index.html )
Więcej dzienników testów można zobaczyć tutaj https://www.surasint.com/spring-boot-webfilter-instead-of-component/
źródło
Filter
interfejs wywoływany wiele razy podczas uruchamiania aplikacjiContext. Czy jest jakiś sposób, aby wykonać to tylko raz?Oto przykład mojej niestandardowej klasy Filter:
Dodałem go do konfiguracji rozruchu Spring, dodając go do klasy Configuration w następujący sposób:
źródło
Z dokumentów wiosny,
Wbudowane kontenery serwletów - Dodaj serwlet, filtr lub detektor do aplikacji
Na przykład:
Dodaj tę
@Bean
konfigurację do swojej@Configuration
klasy, a filtr zostanie zarejestrowany podczas uruchamiania.Możesz także dodawać serwlety, filtry i detektory za pomocą skanowania ścieżki klas,
źródło
Jeśli używasz Spring Boot + Spring Security, możesz to zrobić w konfiguracji zabezpieczeń.
W poniższym przykładzie dodałem niestandardowy filtr przed nazwą użytkownika HasłoHuthenticationFilter (zobacz wszystkie domyślne filtry Spring Security i ich kolejność ).
I klasa filtrów
źródło
Za pomocą adnotacji @WebFilter można to zrobić w następujący sposób:
źródło
Mamy mniej więcej cztery różne opcje rejestracji filtra za pomocą Springa .
Po pierwsze możemy stworzyć Spring Bean implementujący Filtr lub rozszerzający HttpFilter :
Po drugie, możemy utworzyć Spring Bean rozszerzający GenericFilterBean :
Alternatywnie możemy użyć klasy FilterRegistrationBean :
I wreszcie możemy użyć @WebFilter adnotacji z @ServletComponentScan :
źródło
To raczej rada niż odpowiedź, ale jeśli używasz Spring MVC w swojej aplikacji internetowej, dobrym pomysłem jest użycie Spring HandlerInterceptor zamiast Filter
Może wykonywać to samo zadanie, ale także - Może współpracować z ModelAndView - Jego metody można wywoływać przed przetwarzaniem żądania i po nim lub po zakończeniu żądania.
- Można to łatwo przetestować
1 Zaimplementuj interfejs HandlerInterceptor i dodaj adnotację @Component do swojej klasy
2 Skonfiguruj przechwytywacz
źródło
Ten filtr pomoże również w uzyskaniu dostępu do różnych źródeł
źródło
Możesz użyć @WebFilter javax.servlet.annotation.WebFilter na klasie, która implementuje javax.servlet.Filter
Następnie użyj @ServletComponentScan, aby się zarejestrować
źródło
Widziałem tutaj wiele odpowiedzi, ale nie próbowałem żadnej z nich. Właśnie utworzyłem filtr jak w poniższym kodzie.
I pozostawił pozostałą aplikację Spring Boot taką, jaka była.
źródło
Potrzebujesz 2 głównych rzeczy: - Dodaj
@ServletComponentScan
do swojej klasy głównej - możesz dodać do niej pakiet o nazwie filtr, tworzącFilter
klasę, która ma następujące elementy:źródło
możesz również zrobić filtr za pomocą @WebFilter i implementuje Filtr, to zrobi.
źródło
Filtry, jak sugeruje nazwa, używane do przeprowadzania filtrowania na żądanie do zasobu lub na odpowiedź z zasobu, lub oba. Spring Boot oferuje kilka opcji rejestracji niestandardowych filtrów w aplikacji Spring Boot. Spójrzmy na różne opcje.
1. Zdefiniuj filtr Spring Boot i kolejność wywoływania
Zaimplementuj interfejs Filtr, aby utworzyć nowy filtr w Spring Boot.
Rzućmy okiem na kilka ważnych punktów w powyższym kodzie
Aby uruchomić filtry w odpowiedniej kolejności - musieliśmy użyć adnotacji @Order .
W powyższym kodzie CustomFirstFilter będzie działał przed CustomSecondFilter.
2. Wzorzec adresu URL
Jeśli mapowanie oparte na konwencjach nie jest wystarczająco elastyczne, możemy użyć FilterRegistrationBean do pełnej kontroli aplikacji. W tym przypadku nie używaj adnotacji @Component dla klasy filtra, ale zarejestruj filtr za pomocą FilterRegistrationBean .
Zarejestruj niestandardowy filtr za pomocą FilterRegistrationBean .
źródło
Musisz zaimplementować Filtr i mieć adnotację @WebFilter (urlPatterns = "/ *")
W klasie Application lub Configuration należy dodać @ServletComponentScan. W ten sposób Twój filtr zostanie zarejestrowany.
źródło
@WebFilter
tak dopiero od Servlet 3.0. Więc może nie działać poprawnie dla 2.5Krok 1: Utwórz składnik filtru, wdrażając interfejs filtra.
Krok 2: Ustaw ten filtr na wzorce URI za pomocą FilterRegistrationBean.
Możesz skorzystać z tego linku, aby uzyskać kompletną aplikację.
źródło
Najpierw dodaj
@ServletComponentScan
do swojej klasy SpringBootApplication.Po drugie, utwórz plik filtru rozszerzający klasę Filter lub klasę filtrów innej firmy i dodaj
@WebFilter
do tego pliku w następujący sposób:źródło
Odpowiedź zobaczyłem @Vasily Komarov. Podobne podejście, ale przy użyciu abstrakcyjnej klasy HandlerInterceptorAdapter zamiast HandlerInterceptor .
Oto przykład...
źródło
Jak wszyscy wiecie, Spring Boot to wspaniały sposób na opracowanie aplikacji internetowej lub StandaloneApp przy minimalnej konfiguracji i szczegółowej instalacji.
W ten sposób osiągnąłem Rozwój filtra internetowego w aplikacji Spring Boot
Wersja Spring Boot: 2.0.4. ZWOLNIENIE
Wersja Java: 8.0
Specyfikacja serwletu: Servlet 3.0 (obowiązkowy i ważny)
Zadeklarowałem mój filtr sieciowy w następujący sposób, zgodnie ze specyfikacją serwletu 3.0
Jest to programowy sposób definiowania filtra jako zamiennika definicji opartych na pliku web.xml.
Adnotacja „@Webfilter” zostanie przetworzona przez kontener podczas wdrażania, klasa Filter, w której zostanie znaleziona, zostanie utworzona zgodnie z konfiguracją i zastosowana do wzorców adresów URL javax.servlet.Servlets i javax.servlet.DispatcherTypes.
Aby wdrożyć aplikację Spring Boot jako „tradycyjną WAR”, klasa aplikacji powinna rozszerzyć SpringBootServletInitializer.
UWAGA :: SpringBootServletInitializer to „programowa implementacja” pliku web.xml w odniesieniu do specyfikacji Servlet 3.0+, która wymaga implementacji WebApplicationInitializer.
Zatem SpringBootApplication nie wymaga pliku „web.xml”, ponieważ jego klasa aplikacji (po rozszerzeniu SpringBootServletInitializer) skanuje w poszukiwaniu
- @WebFilter,
- @WebListener i
- @WebServlet.
Ta adnotacja umożliwia skanowanie pakietów podstawowych w poszukiwaniu składników WWW opatrzonych adnotacjami @WebFilter, @WebListener i @WebServlet.
Ze względu na fakt, że osadzone kontenery nie obsługują adnotacji @WebServlet, @WebFilter i @WebListener, Spring Boot, polegając w dużej mierze na osadzonych kontenerach, wprowadził nową adnotację @ServletComponentScan do obsługi niektórych zależnych słoików, które używają tych 3 adnotacji.
Skanowanie jest wykonywane tylko przy użyciu osadzonego kontenera serwletu.
Tutaj: zdefiniowałem niestandardową klasę: „ServletInitializer”, która rozszerza klasę: SpringBootServletInitializer.
Jak wyjaśniono wcześniej, SpringBootServletInitializer odpowiada za skanowanie adnotacji: -
- @WebFilter,
- @WebListener i
- @WebServlet.
I dlatego klasa aplikacji Spring Boot powinna
źródło
Filtry są najczęściej używane w plikach rejestratora, różni się w zależności od rejestratora używanego w projekcie Lemme wyjaśnić dla log4j2:
Filtry służą do ograniczania danych, a ja dodatkowo stosuję filtr progowy w celu ograniczenia poziomów danych w przepływie. Wspomniałem o poziomach, które można tam ograniczyć. Dla dalszego odniesienia patrz kolejność poziomów log4j2 - Poziomy Log4J: WSZYSTKIE> ŚLEDZENIE> DEBUGOWANIE> INFORMACJE> OSTRZEŻENIE> BŁĄD> FATAL> WYŁ.
źródło
FilterRegistrationBean
jak wspomniano w pytaniu jestjavax.servlet.Filter
odpowiedź ta opowiada oorg.apache.logging.log4j.core.Filter