Как мне лениво загрузить Spring Security?
-
22-09-2019 - |
Вопрос
Как мне не создавать экземпляр Spring Security до тех пор, пока мне это не понадобится?
Я использую Google App Engine, поэтому время запуска моего веб-приложения очень важно.Иногда, когда пользователь запрашивает страницу, он должен все время ждать создания экземпляра моего веб-приложения, прежде чем получить ответ (это называется запросом на загрузку).
Некоторые страницы моего приложения не требуют аутентификации.Для этих страниц, если запрос является запросом на загрузку, я не хочу, чтобы пользователю приходилось ждать дополнительные ~ 1,5 секунды для создания экземпляра Spring Security.
Я уже выяснил, как лениво загружать все остальные компоненты моего приложения, Spring Security - единственное, чего я не знаю, как это сделать.У кого-нибудь есть идея?
Редактировать:Если кто-нибудь знает, как создать экземпляр Spring Security из кода вместо использования applicationContext-security.xml, тогда, я думаю, я мог бы выяснить, как его лениво загрузить.
Решение
Что ж, я наконец-то понял это.Мне пришлось создать подкласс org.springframework.web.context.ContextLoaderListener
и org.springframework.web.filter.DelegatingFilterProxy
ничего не делать, пока я не вызову для них метод activate.
Другие советы
Описанный взлом здесь сработало на меня:
...вы можете решить эту проблему с помощью любого LazyInitTargetSource для UserDetailsService.
<bean id="userDetailsService" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="targetSource">
<bean class="org.springframework.aop.target.LazyInitTargetSource">
<property name="targetBeanName" value="targetUserDetailsService"/>
</bean>
</property>
</bean>
<bean id="targetUserDetailsService" class="MyCustomUserService" lazy-init="true">
....
</bean>
Вы можете настроить <url-pattern>
сопоставление фильтров безопасности Spring в web.xml
чтобы соответствовать только защищенным ресурсам (а также страницам входа-выхода и другим ресурсам, для которых требуется обработка Spring Security), и оберните фильтр по умолчанию своей собственной ленивой оболочкой, как вы сделали с DispatcherServlet
.
Редактировать:
Проблема, похоже, сложнее, чем я думал.Вы также можете попытаться определить свой XML-файл безопасности как <beans default-lazy-init="true" ...>