我如何懒加载Spring Security?

时间:2010-01-25 18:00:15

标签: java spring-security lazy-loading web.xml

在需要之前,如何才能实例化Spring Security?

我正在使用Google App Engine,因此我的网络应用的启动时间非常重要。有时,当用户请求页面时,他们必须等待我的Web应用程序实例化的所有时间才能获得响应(这称为加载请求)。

我的应用的某些页面不需要身份验证。对于这些页面,如果请求是加载请求,我不希望用户必须等待额外的~1.5秒才能使Spring Security实例化。

我已经知道如何延迟加载我的应用程序的所有其他组件,Spring Security是唯一一个我不知道如何。有人有想法吗?

编辑:如果有人知道如何从代码中实例化Spring Security而不是使用applicationContext-security.xml,那么我想我可以弄清楚如何延迟加载它。

3 个答案:

答案 0 :(得分:1)

好吧,我终于明白了。我必须将org.springframework.web.context.ContextLoaderListenerorg.springframework.web.filter.DelegatingFilterProxy子类化为不执行任何操作,直到我们对它们调用activate方法。

答案 1 :(得分:1)

描述here的黑客为我工作:

...您可以使用UserDetailsS​​ervice的任何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>

答案 2 :(得分:0)

您可以在<url-pattern>中配置web.xml的Spring Security过滤器映射,以仅匹配安全资源(以及登录注销页面和需要Spring Security处理的其他资源),并将其换行使用您自己的惰性包装器的默认过滤器,就像使用DispatcherServlet一样。

修改 这个问题似乎比我想象的要复杂得多。您还可以尝试将安全xml定义为<beans default-lazy-init="true" ...>