поддержка async отключается при настройке HTTPS с Tomcat и Springboot - PullRequest
0 голосов
/ 26 июня 2019

В настоящее время я работаю над приложением Springboot 2.1 с включенным tomcat и HTTPS.Мы пытаемся написать несколько новых API, используя новый стек Reactive, предоставляемый spring-webflux.Поскольку приложение по-прежнему имеет традиционные блокирующие конечные точки, нам нужно использовать Tomcat с включенной поддержкой асинхронного соединения, чтобы новые неблокирующие API-интерфейсы работали.

При запуске API и попытке достичь конечной точки через HTTPS я получаю следующую ошибку:

ERROR c.b.b.c.u.s.r.c.ApiExceptionHandler - Async support must be enabled on a servlet and for all filters involved in async request processing. This is done in Java code using the Servlet API or by adding "<async-supported>true</async-supported>" to servlet and filter declarations in web.xml.
java.lang.IllegalStateException: Async support must be enabled on a servlet and for all filters involved in async request processing. This is done in Java code using the Servlet API or by adding "<async-supported>true</async-supported>" to servlet and filter declarations in web.xml.

Если я отключаю HTTPS и нажимаю API, используя HTTP, запрос работает, и я получаю ответ от нового неблокирующего контроллера API.

В настоящее время HTTPSнастроен с использованием следующего кода (если я удаляю этот конфиг, не блокирующий API работает):

@Configuration
public class Config implements WebServerFactoryCustomizer<TomcatServletWebServerFactory> {

    private final SslProperties sslProperties;
    private final LogbackAccessProperties logbackAccessProperties;

    public BootConfig(SslProperties sslProperties, LogbackAccessProperties logbackAccessProperties) {
        this.sslProperties = sslProperties;
        this.logbackAccessProperties = logbackAccessProperties;
    }

    @Override
    public void customize(TomcatServletWebServerFactory factory) {
        factory.addContextValves(getLogbackValve());
        factory.addConnectorCustomizers(connector -> {
            Http11NioProtocol proto = (Http11NioProtocol) connector.getProtocolHandler();
            proto.setSSLEnabled(true);
            connector.setScheme("https");
            connector.setSecure(true);
            proto.setKeystoreFile(sslProperties.getKeyStoreLocation());
            proto.setKeystorePass(sslProperties.getKeyStorePassword());
            proto.setKeystoreType(sslProperties.getKeyStoreType());
            proto.setTruststoreFile(sslProperties.getKeyStoreLocation());
            proto.setTruststorePass(sslProperties.getKeyStorePassword());
            proto.setTruststoreType(sslProperties.getKeyStoreType());
            proto.setKeyAlias(sslProperties.getHostingServerKeyAlias());
            proto.setSslEnabledProtocols("TLSv1.2");
        });
    }

    private LogbackValve getLogbackValve() {
        LogbackValve valve = new LogbackValve();
        valve.setFilename(logbackAccessProperties.getConfig());
        return valve;
    }
}

Чтение в Интернете. Я вижу, что Springboot по умолчанию включает async-supported при использовании tomcat и spring-boot-starter-webflux с spring-mvc.Это похоже на случай использования HTTP, но при настройке HTTPS, похоже, больше не работает.Есть ли другой способ включить его при настройке HTTPS?

1 Ответ

0 голосов
/ 26 июня 2019

В итоге я нашел причину проблемы.Использование HTTPS не вызывает проблемы.Я полагал, что это имело место, так как, когда я удалил метод public void customize(TomcatServletWebServerFactory factory) {..., он работал.

Похоже, асинхронность была отключена добавляемым LogbackValve.Клапан должен быть установлен на asyncSupported=true, чтобы работать.Поэтому мне пришлось обновить мой метод до:

    private LogbackValve getLogbackValve() {
        LogbackValve valve = new LogbackValve();
        valve.setFilename(logbackAccessProperties.getConfig());
        valve.setAsyncSupported(true); // This line fixed the issue
        return valve;
    }

Из прочтения документации это было не очень очевидно, поэтому мне потребовалось некоторое время, чтобы понять это.Я надеюсь, это поможет, если кто-то столкнется с той же проблемой :)

...