在Spring中的嵌入式Jetty上配置Spring安全性

在Spring中的嵌入式Jetty上配置Spring安全性,spring,spring-security,jetty,embedded-jetty,Spring,Spring Security,Jetty,Embedded Jetty,我有一个SpringBeans定义文件,如下所示 <bean id="jettyZk" class="org.eclipse.jetty.server.Server" init-method="start" destroy-method="stop"> <!-- properties, threadPool, connectors --> <property name="handler"> <bean class="or

我有一个SpringBeans定义文件,如下所示

<bean id="jettyZk" class="org.eclipse.jetty.server.Server" init-method="start" destroy-method="stop">
    <!-- properties, threadPool, connectors -->

    <property name="handler">
        <bean class="org.eclipse.jetty.servlet.ServletContextHandler">
            <property name="eventListeners">
                <list>
                    <!-- my.ContextLoaderListener
                    * An ApplicationContextAware ContextLoaderListener that allows for using the current ApplicationContext,
                    * as determined by ApplicationContextAware, as the parent for the Root WebApplicationContext.
                    * 
                    * Also provides for specifying the contextConfigLocation of the Root WebApplicationContext, because
                    * Eclipse Jetty 7 ServletContextHandler does not expose a setInitParameters method.
                    -->
                    <bean class="my.ContextLoaderListener">
                        <property name="contextConfigLocation" value="/META-INF/spring/applicationContext-securityZk.xml"/>
                    </bean>
                    <!-- not sure if this is needed, disabled for now -->
                    <!-- <bean class="org.springframework.web.context.request.RequestContextListener"/> -->
                </list>
            </property>
            <property name="servletHandler">
                <bean class="org.eclipse.jetty.servlet.ServletHandler">
                    <property name="filters">
                        <list>
                            <bean class="org.eclipse.jetty.servlet.FilterHolder">
                                <property name="name" value="springSecurityFilterChain"/>
                                <property name="filter">
                                    <bean class="org.springframework.web.filter.DelegatingFilterProxy"/>
                                </property>
                            </bean>
                        </list>
                    </property>
                    <!-- filterMappings, servlets, servletMappings -->
                </bean>
            </property>
        </bean>
    </property>
</bean>
这是使用弹簧3.0.5.0释放

这个例外是可以理解的,看看DelegatingFilterProxy#findWebApplicationContext的代码和JavaDocs,它说

WebApplicationContext必须已加载并存储在中 初始化(或调用)此筛选器之前的ServletContext

因为我试图将过滤器创建为上下文处理程序的(子)属性,所以上下文还没有初始化,因此SpringWAC也没有初始化,这似乎是合理的

我想知道的是,如何在Spring本身正在组装的嵌入式Jetty容器中配置Spring安全性

似乎有一个第22条军规的场景,只是需要一个后期初始化,但我找不到一个合适的标志来玩弄。我已经尝试将
lazy init=“true”
设置到过滤器bean上,但这似乎没有取得多大效果,这并不令人惊讶

相关的:

我正在运行Jetty 6.1.4和Spring 3.0.5,但我使用的是传统的方式,即WEB-INF/WEB.xml

采用这种方法,不会产生任何问题

public class JettyServer {

    public static void main(String[] args) throws Exception {
    Properties props = new Properties();
    props.load(new FileInputStream("./etc/server.properties"));

    Server server = new Server();

    final String configFile = props.getProperty("server.config");

    XmlConfiguration configuration = 
        new XmlConfiguration(new File(configFile).toURI().toURL());
    configuration.configure(server);
    HandlerCollection handlers = new HandlerCollection();

    WebAppContext webapp = new WebAppContext();
    webapp.setContextPath(props.getProperty("context.path"));
    webapp.setDefaultsDescriptor(props.getProperty("default.config"));

    webapp.setWar(props.getProperty("war.path"));

    NCSARequestLog requestLog = new NCSARequestLog(props.getProperty("log.file"));
    requestLog.setExtended(true);
    RequestLogHandler requestLogHandler = new RequestLogHandler();
    requestLogHandler.setRequestLog(requestLog);

    handlers.setHandlers(
       new Handler[] { webapp, new DefaultHandler(), requestLogHandler });

    server.setHandler(handlers);

    server.setStopAtShutdown(true);
    server.setSendServerVersion(true);

    server.start();
    server.join();
}

你让Jetty提供了一份战争文件,这不是我要做的。想想看,我又花了几个小时左右的时间调试它是如何调用的,我没有运行时可用的
org.eclipse.jetty.webapp
包,所以似乎不管我从哪里让Spring实例化过滤器,在初始化ServletContext之前调用PropertiesSet之后。我注意到我在错误的容器上设置了“过滤器”,所以我将更新问题中的示例,但我仍然被卡住了。尽管如此,还是要感谢:)作为处理这个问题的结果,我一直在研究SpringJavaConfig,有一个相关的问题:你有没有想出一种方法来实现这一点?我有一个基本相同的问题。我最终得到了一个基于@Configuration的设置。我正在处理类似的问题。你能指出任何好的信息来源或示例吗?
public class JettyServer {

    public static void main(String[] args) throws Exception {
    Properties props = new Properties();
    props.load(new FileInputStream("./etc/server.properties"));

    Server server = new Server();

    final String configFile = props.getProperty("server.config");

    XmlConfiguration configuration = 
        new XmlConfiguration(new File(configFile).toURI().toURL());
    configuration.configure(server);
    HandlerCollection handlers = new HandlerCollection();

    WebAppContext webapp = new WebAppContext();
    webapp.setContextPath(props.getProperty("context.path"));
    webapp.setDefaultsDescriptor(props.getProperty("default.config"));

    webapp.setWar(props.getProperty("war.path"));

    NCSARequestLog requestLog = new NCSARequestLog(props.getProperty("log.file"));
    requestLog.setExtended(true);
    RequestLogHandler requestLogHandler = new RequestLogHandler();
    requestLogHandler.setRequestLog(requestLog);

    handlers.setHandlers(
       new Handler[] { webapp, new DefaultHandler(), requestLogHandler });

    server.setHandler(handlers);

    server.setStopAtShutdown(true);
    server.setSendServerVersion(true);

    server.start();
    server.join();
}