【问题标题】:When customizing Tomcat: A ServletContext is required to configure default servlet handling自定义 Tomcat 时:需要 ServletContext 来配置默认 servlet 处理
【发布时间】:2014-05-25 08:32:28
【问题描述】:

我有一个简单的 spring boot 应用程序已经运行:我可以 curl 来命中端点等。

我正在尝试根据spring boot reference guide (pg 115) 将其配置为与 HTTPS 一起使用,并将类似这样的代码添加到我的 @Configuration 类中:

@Bean
@Inject
public EmbeddedServletContainerCustomizer tomcatCustomizer(@Value("${keystore.file}") String keystoreFile,
                                                           @Value("${keystore.password}") String keystorePassword,
                                                           @Value("${keystore.type}") String keystoreType,
                                                           @Value("${keystore.alias}") String keystoreAlias) throws FileNotFoundException
{
    final String absoluteKeystoreFile = ResourceUtils.getFile(keystoreFile).getAbsolutePath();
    EmbeddedServletContainerCustomizer tomcatCustomizer = (ConfigurableEmbeddedServletContainer factory) -> {
        TomcatEmbeddedServletContainerFactory containerFactory = (TomcatEmbeddedServletContainerFactory) factory;
        containerFactory.addConnectorCustomizers((TomcatConnectorCustomizer) (Connector connector) -> {
            connector.setSecure(true);
            connector.setScheme("https");
            connector.setAttribute("keystoreFile", absoluteKeystoreFile);
            connector.setAttribute("keystorePass", keystorePassword);
            connector.setAttribute("keystoreType", keystoreType);
            connector.setAttribute("keyAlias", keystoreAlias);
            connector.setAttribute("clientAuth", "false");
            connector.setAttribute("sslProtocol", "TLS");
            connector.setAttribute("SSLEnabled", true);
        });
    };

    return tomcatCustomizer;
}

但是,仅添加此代码后,我以前工作的应用程序现在会获得以下堆栈跟踪:

Caused by: java.lang.IllegalArgumentException: A ServletContext is required to configure default servlet handling
at org.springframework.util.Assert.notNull(Assert.java:112)
at org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer.<init>(DefaultServletHandlerConfigurer.java:54)
at org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport.defaultServletHandlerMapping(WebMvcConfigurationSupport.java:346)
at org.springframework.web.servlet.config.annotation.DelegatingWebMvcConfiguration$$EnhancerBySpringCGLIB$$f697b5e2.CGLIB$defaultServletHandlerMapping$23(<generated>)
at org.springframework.web.servlet.config.annotation.DelegatingWebMvcConfiguration$$EnhancerBySpringCGLIB$$f697b5e2$$FastClassBySpringCGLIB$$972d2616.invoke(<generated>)
at org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:228)
at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:312)
at org.springfr.web.servlet.config.annotation.DelegatingWebMvcConfiguration$$EnhancerBySpringCGLIB$$f697b5e2.defaultServletHandlerMapping(<generated>)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:483)
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:166)
... 16 more

我验证了该方法中的属性是否正确,并尝试按照this question 的建议添加/删除@WebAppConfiguration

我的 gradle 文件正在使用 spring-boot-starter-web:1.0.0.RELEASE。

问题是:如何使用spring boot正确配置https?为什么我的应用程序在我不尝试配置 tomcat 时可以工作,而在我尝试配置 tomcat 时会中断?

谢谢

【问题讨论】:

    标签: tomcat spring-mvc spring-boot


    【解决方案1】:

    刚发完这个问题,我就找到了答案:

    关于如何使用spring boot正确配置https:上面列出的代码最初是添加到我的@Configuration SecurityConfig extends WebSecurityConfigurerAdapter中的。当我将 tomcat 自定义移动到它自己的 @Configuration 类时,它起作用了。

    原因:大概 WebSecurityConfigurerAdapter 在应用程序上下文生命周期中被调用比 @Configurations 的其余部分更早。

    【讨论】:

    • 正确。安全住在Filter,他们必须尽早注册。
    • 我一遍又一遍地在单独的@Configuration 中切换某些配置部分。您能否提供一个描述您提到的行为的链接?或者一些关于@Configuration 的顺序如何工作以及应该注意什么的通用信息来源?
    • 正确,我将它添加到 WebSecurityConfigurerAdapter 中,但它不起作用。更改为@Configuration 后它可以工作。
    猜你喜欢
    • 2014-02-26
    • 2017-02-10
    • 2014-11-10
    • 2016-07-28
    • 2017-06-02
    • 2014-07-31
    • 2016-02-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多