Widzę to w mojej aplikacji Spring MVC web.xml
:
<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
Próbuję dowiedzieć się, dlaczego tam jest i czy jest rzeczywiście potrzebny.
Znalazłem to wyjaśnienie w dokumentacji Spring, ale nie pomaga mi to zrozumieć:
Wydaje się, że komponent ten jest „spoiwem” między serwletami zdefiniowanymi w programie web.xml
a komponentami zdefiniowanymi w programie Spring applicationContext.xml
.
7.1 DelegatingFilterProxy
Korzystając z filtrów serwletów, musisz oczywiście zadeklarować je w swoim
web.xml
, w przeciwnym razie zostaną zignorowane przez kontener serwletów. W Spring Security klasy filtrów są również ziarnami Springa zdefiniowanymi w kontekście aplikacji, dzięki czemu mogą korzystać z bogatych narzędzi do wstrzykiwania zależności i interfejsów cyklu życia Springa. SpringDelegatingFilterProxy
zapewnia łącze międzyweb.xml
kontekstem aplikacji.Podczas korzystania z DelegatingFilterProxy w
web.xml
pliku zobaczysz coś takiego :<filter> <filter-name>myFilter</filter-name> <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> </filter> <filter-mapping> <filter-name>myFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
Zauważ, że filtr jest w rzeczywistości a
DelegatingFilterProxy
, a nie klasą, która faktycznie implementuje logikę filtru. To, coDelegatingFilterProxy
robi, to delegowanie metod filtru do komponentu bean, który jest uzyskiwany z kontekstu aplikacji Spring. Dzięki temu bean może korzystać z obsługi cyklu życia aplikacji internetowej Spring i elastyczności konfiguracji. Fasola musi być implementowanajavax.servlet.Filter
i musi mieć taką samą nazwę, jak nazwa elementu filter-name. Przeczytaj Javadoc dla DelegatingFilterProxy, aby uzyskać więcej informacji
Więc jeśli to wyciągnę z siebie web.xml
, co się stanie? Moje serwlety nie będą w stanie komunikować się z kontenerem Spring? **
źródło
Czy wiesz, co to jest filtr serwletów i jak działa? Jest to bardzo przydatna część specyfikacji serwletu, która pozwala nam zastosować koncepcje podobne do AOP do obsługi żądań HTTP. Wiele frameworków używa implementacji filtrów do różnych rzeczy i nierzadko zdarza się znaleźć ich niestandardowe implementacje, ponieważ są one bardzo proste do napisania i przydatne. W aplikacji Spring większość funkcji, które może wykonać aplikacja, znajduje się w ziarnach Springa. Jednak instancja filtru jest kontrolowana przez kontener Servlet. Kontener tworzy instancję, inicjuje i niszczy go. Specyfikacja serwletu nie wymaga jednak żadnej integracji Springa, więc pozostaje Ci naprawdę przydatna koncepcja (Filtry) bez wygodnego sposobu na powiązanie jej z aplikacją Spring i fasolami, które wykonują pracę.
Wprowadź DelegatingFilterProxy. Piszesz implementację Filter i zmieniasz ją w komponent bean Spring, ale zamiast dodawać własną klasę Filter do pliku web.xml, używasz metody DelegatingFilterProxy i nadajesz jej nazwę bean filtra w kontekście Spring. (Jeśli nie podasz jawnie nazwy, użyje ona „nazwy filtru”). Następnie w czasie wykonywania element DelegatingFilterProxy obsługuje złożoność znajdowania rzeczywistej implementacji - tej, którą napisałeś i skonfigurowałeś w Spring - i kierowania do niej żądań . Tak więc w czasie wykonywania wygląda to tak, jakbyś umieścił swój filtr w pliku web.xml, ale zyskujesz możliwość połączenia go tak, jak każdą inną ziarno Springa.
Jeśli usuniesz mapowanie tego filtra z pliku web.xml, wszystko będzie nadal działać, ale żaden z Twoich adresów URL nie będzie zabezpieczony. (Zakładając, że nazwa „springSecurityFilterChain” dokładnie opisuje, co robi.) To dlatego, że to mapowanie filtruje każde przychodzące żądanie i przekazuje je do filtra bezpieczeństwa zdefiniowanego w kontekście Springa.
źródło
Co to są filtry serwletów?
Filtry serwletów to ogólnie koncepcja Java WebApp. Możesz mieć filtry serwletów w dowolnej aplikacji internetowej, niezależnie od tego, czy używasz w niej frameworka Spring, czy nie.
Filtry te mogą przechwytywać żądania, zanim dotrą do docelowego serwletu. W filtrach serwletów można zaimplementować typową funkcjonalność, taką jak autoryzacja. Po wdrożeniu możesz skonfigurować filtr w swoim pliku web.xml, aby był stosowany do określonego serwletu, określonych wzorców adresów URL żądań lub wszystkich wzorców adresów URL.
Gdzie są używane filtry serwletów?
Nowoczesne aplikacje internetowe mogą mieć dziesiątki takich filtrów. Takie rzeczy, jak autoryzacja, buforowanie, zarządzanie sesjami ORM i wstrzykiwanie zależności są często implementowane za pomocą filtra serwletów. Wszystkie te filtry należy zarejestrować w
web.xml
.Tworzenie instancji filtrów serwletów - bez Spring Framework
Twój kontener serwletów tworzy instancje filtrów zadeklarowanych w programie
web.xml
i wywołuje je w odpowiednim czasie (tj. Podczas obsługi żądań serwletów). Teraz, jeśli jesteś jak większość fanów Dependency Injection (DI), prawdopodobnie powiedziałbyś, że tworzenie instancji jest tym, co mój framework DI (Spring) robi lepiej. Czy nie mogę uzyskać moich filtrów serwletów utworzonych za pomocą Springa, aby były dostępne dla wszystkich dobroci DI?DelegatingFilterProxy
, więc Spring utworzy Twoje instancje filtrówTutaj
DelegatingFilterProxy
wkracza.DelegatingFilterProxy
Jest impelmentacjąjavax.servlet.Filter
interfejsu dostarczonego przez Spring Framework. Po skonfigurowaniuDelegatingFilterProxy
w web.xml możesz zadeklarować rzeczywiste ziarna, które wykonują filtrowanie w Twojej konfiguracji wiosennej. W ten sposób Spring tworzy instancje ziaren, które faktycznie filtrują, i możesz użyć DI do ich skonfigurowania.Zauważ, że potrzebujesz tylko jednej
DelegatingFilterProxy
deklaracji w programie,web.xml
ale możesz mieć kilkabean
połączonych ze sobą filtrów w kontekście aplikacji.źródło
Rzecz w tym, że filtrami serwletów zarządza kontener serwletów, a nie wiosną. Może być konieczne wstrzyknięcie niektórych elementów sprężyny do filtrów.
Jeśli więc potrzebujesz czegoś takiego:
wtedy potrzebujesz proxy filtru delegującego.
źródło
Masz rację co do rzeczy „kleju”. Jak napisano w JavaDocs z FilterChainProxy :
Zapoznaj się z sekcją FIlterChainProxy na blogu Behind the Spring Security Namespace, aby uzyskać doskonałe wyjaśnienie.
źródło
Byłem zdumiony przez „springSecurityFilterChain” w web.xml i znalazłem tę odpowiedź w dokumencie bezpieczeństwa springframework:
Oto link http://docs.spring.io/spring-security/site/docs/3.0.x/reference/appendix-namespace.html
źródło
Minęło dużo czasu, ale miałem to samo pytanie i znalazłem to: https://www.javacodegeeks.com/2013/11/spring-security-behind-the-scenes.html
Próbowałem uruchomić mój projekt zabezpieczeń wiosennych, usuwając ten filtr, a także dodając go. Odkryłem, że jeśli dodamy filtr, tylko wtedy połączenie przekieruje do wymaganej strony logowania, określonej w konfiguracji zabezpieczeń sprężynowych.
Dlatego zgadzając się na odpowiedź @ Ryan.
źródło