Я вижу это в своем приложении Spring MVC web.xml
:
<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
Я пытаюсь понять, зачем он нужен и действительно ли он нужен.
Я нашел это объяснение в документации Spring, но оно не помогает мне понять его:
Кажется, предполагается, что этот компонент является «связующим звеном» между сервлетами, определенными в, web.xml
и компонентами, определенными в Spring applicationContext.xml
.
7.1 ДелегированиеFilterProxy
При использовании фильтров сервлетов вам, очевидно, нужно объявить их в вашем
web.xml
, иначе они будут проигнорированы контейнером сервлетов. В Spring Security классы фильтров также являются компонентами Spring, определенными в контексте приложения и, таким образом, могут использовать преимущества богатых возможностей Spring для внедрения зависимостей и интерфейсов жизненного цикла. SpringDelegatingFilterProxy
обеспечивает связь междуweb.xml
контекстом приложения.При использовании DelegatingFilterProxy вы увидите в
web.xml
файле что-то вроде этого :<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>
Обратите внимание, что на самом деле фильтр - это
DelegatingFilterProxy
класс, а не класс, который фактически реализует логику фильтра. ЧтоDelegatingFilterProxy
делает, так это делегировать методы фильтра бину, который получается из контекста приложения Spring. Это позволяет компоненту использовать преимущества поддержки жизненного цикла контекста веб-приложения Spring и гибкости конфигурации. Компонент должен быть реализован,javax.servlet.Filter
и у него должно быть то же имя, что и в элементе filter-name. Прочтите Javadoc для DelegatingFilterProxy для получения дополнительной информации.
Итак, если я вытащу это из своего web.xml
, что будет? Мои сервлеты не смогут взаимодействовать с контейнером Spring? **
Вы знаете, что такое сервлет-фильтр и как он работает? Это очень полезная часть спецификации сервлетов, позволяющая нам применять концепции, подобные АОП, для обслуживания HTTP-запросов. Многие фреймворки используют реализации фильтров для различных целей, и нередко можно найти их собственные реализации, потому что они очень просты в написании и полезны. В приложении Spring большая часть того, что может делать ваше приложение, находится в ваших bean-компонентах Spring. Однако экземпляр фильтра управляется контейнером сервлета. Контейнер создает, инициализирует и уничтожает его. Тем не менее, спецификация сервлета не требует какой-либо интеграции со Spring, поэтому у вас остается действительно полезная концепция (фильтры) без удобного способа привязать ее к вашему приложению Spring и bean-компонентам, которые выполняют эту работу.
Введите DelegatingFilterProxy. Вы пишете реализацию фильтра и делаете ее bean-компонентом Spring, но вместо добавления вашего собственного класса Filter в web.xml вы используете DelegatingFilterProxy и даете ему имя bean-компонента вашего фильтра в контексте Spring. (Если вы явно не указываете имя, оно использует «имя-фильтра».) Затем во время выполнения DelegatingFilterProxy обрабатывает сложность поиска реальной реализации - той, которую вы написали и настроили в Spring, - и маршрутизации запросов к ней. , Таким образом, во время выполнения это как если бы вы указали свой фильтр в файле web.xml, но вы получаете возможность подключить его, как любой другой компонент Spring.
Если вы удалите это сопоставление фильтра из своего web.xml, все будет продолжать работать, но ни один из ваших URL-адресов не будет защищен. (Предполагается, что имя «springSecurityFilterChain» точно описывает то, что он делает.) Это потому, что это отображение фильтрует каждый входящий запрос и передает его фильтру безопасности, который определен в вашем контексте Spring.
источник
Что такое фильтры сервлетов?
Фильтры сервлетов , в общем, являются концепцией Java WebApp. У вас могут быть фильтры сервлетов в любом веб-приложении, независимо от того, используете ли вы платформу Spring в своем приложении.
Эти фильтры могут перехватывать запросы до того, как они достигнут целевого сервлета. Вы можете реализовать общие функции, такие как авторизация, в фильтрах сервлетов. После реализации вы можете настроить фильтр в своем файле web.xml для применения к определенному сервлету, конкретным шаблонам URL-адресов запроса или всем шаблонам URL-адресов.
Где используются фильтры сервлетов?
В современных веб-приложениях таких фильтров может быть несколько десятков. Такие вещи, как авторизация, кеширование, управление сеансом ORM и внедрение зависимостей, часто реализуются с помощью фильтра сервлетов. Все эти фильтры необходимо зарегистрировать в
web.xml
.Создание экземпляров фильтров сервлетов - без Spring Framework
Контейнер сервлетов создает экземпляры фильтров, объявленных в,
web.xml
и вызывает их в соответствующее время (например, при обслуживании запросов сервлетов). Теперь, если вы похожи на большинство поклонников внедрения зависимостей (DI), вы, вероятно, скажете, что создание экземпляров - это то, что моя структура DI (Spring) делает лучше. Разве я не могу создать свои фильтры сервлетов с помощью Spring, чтобы они подчинялись всем добротам DI?DelegatingFilterProxy
, так что Spring создает ваши экземпляры фильтраЭто где
DelegatingFilterProxy
шаги.DelegatingFilterProxy
Является impelmentation изjavax.servlet.Filter
интерфейса , предоставляемого Spring Framework. После настройкиDelegatingFilterProxy
в web.xml вы можете объявить фактические bean-компоненты, которые выполняют фильтрацию, в конфигурации Spring. Таким образом, Spring создает экземпляры bean-компонентов, которые выполняют фактическую фильтрацию, и вы можете использовать DI для настройки этих bean-компонентов.Обратите внимание, что вам нужно только одно
DelegatingFilterProxy
объявление,web.xml
но вы можетеbean
связать несколько фильтров в контексте вашего приложения.источник
Дело в том, что фильтры сервлетов управляются контейнером сервлетов, а не Spring. И вам может потребоваться добавить в фильтры некоторые пружинные компоненты.
Итак, если вам нужно что-то вроде:
тогда вам понадобится делегирующий прокси-фильтр.
источник
Вы правы насчет «клея». Как написано в JavaDocs FilterChainProxy :
Пожалуйста, см. Раздел FIlterChainProxy в блоге За пространством имен Spring Security для отличного объяснения.
источник
Я был озадачен «springSecurityFilterChain» в web.xml и нашел этот ответ в документе по безопасности springframework:
Вот ссылка http://docs.spring.io/spring-security/site/docs/3.0.x/reference/appendix-namespace.html
источник
Прошло много времени, но у меня был тот же вопрос, и я нашел это: https://www.javacodegeeks.com/2013/11/spring-security-behind-the-scenes.html
Я попытался запустить свой весенний проект безопасности, удалив соответствующий фильтр, а также добавив его. Я обнаружил, что если мы добавим фильтр, только тогда вызов будет перенаправлен на требуемую страницу входа, как определено в конфигурации spring -security.
Следовательно, соглашаясь с ответом @Ryan.
источник