如何延迟加载 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
,直到我称之为激活方法对他们没有做任何事情。
其他提示
黑客描述 这里 为我工作:
...您可以使用 UserDetailsService 的任何 LazyInitTargetSource 解决此问题。
<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 Security过滤器映射的web.xml
s相匹配的安全资源只(以及登录,注销页面和其他资源需要Spring Security的处理),并用自己的懒惰包装纸包裹默认筛选器,像你一样有DispatcherServlet
。
修改强>
这个问题似乎比我想象的更复杂。您也可以尝试定义您的安全XML作为<beans default-lazy-init="true" ...>