Весенний ботинок 2 - AJP

Я добавил коннектор для AJP в свой проект spring boot 2

 @Bean
 public ServletWebServerFactory servletContainer() {
        TomcatServletWebServerFactory tomcat = new 
   TomcatServletWebServerFactory() {
            @Override
            protected void postProcessContext(Context context) {
                SecurityConstraint securityConstraint = new SecurityConstraint();
                securityConstraint.setUserConstraint("CONFIDENTIAL");
                SecurityCollection collection = new SecurityCollection();
                collection.addPattern("/*");
                securityConstraint.addCollection(collection);
                context.addConstraint(securityConstraint);
            }
        };
        tomcat.addAdditionalTomcatConnectors(redirectConnector());

        return tomcat;
    }

    private Connector redirectConnector() {
        Connector connector = new Connector("AJP/1.3");
        connector.setScheme("http");
        connector.setPort(ajpPort);
        connector.setSecure(false);
        connector.setAllowTrace(false);
        return connector;
    }

Это прекрасно работает. Теперь я могу получить доступ к своему весеннему загрузочному приложению через мой веб-сервер apache. Но теперь, если я запускаю свое приложение для весенней загрузки, я не могу напрямую получить доступ к своему приложению для весенней загрузки. Итак, этот URL-адрес больше не работает

http: // локальный: 13080 / онлайн / showlogin? m = test

Если я отключу коннектор AJP, URL-адрес снова заработает. Я пробовал следующее

 private Connector redirectConnector2() {
    Connector connector = new Connector(TomcatServletWebServerFactory.DEFAULT_PROTOCOL);
    connector.setScheme("http");
    connector.setPort(13080);
    connector.setSecure(false);
    connector.setAllowTrace(false);
    return connector;
}
...
tomcat.addAdditionalTomcatConnectors(redirectConnector2());
...

Но это мне не помогает.

Вместо создания TomcatServletWebServerFactory создайте WebServerFactoryCustomizer<TomcatServletWebServerFactory>, который добавляет материал AJP. Это будет выполнено в дополнение к настройкам Spring Boot по умолчанию.

M. Deinum 14.03.2018 11:48
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
4
1
9 522
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Это работает для меня:

    @Bean
    public WebServerFactoryCustomizer<TomcatServletWebServerFactory> servletContainer() {
      return server -> {
        if (server instanceof TomcatServletWebServerFactory) {
            ((TomcatServletWebServerFactory) server).addAdditionalTomcatConnectors(redirectConnector());
        }
      };
    }

    private Connector redirectConnector() {
       Connector connector = new Connector("AJP/1.3");
       connector.setScheme("http");
       connector.setPort(ajpPort);
       connector.setSecure(false);
       connector.setAllowTrace(false);
       return connector;
    }

Мы успешно использовали код Томас отвечает в течение более длительного времени, но он перестал работать после того, как мы обновились до версии Spring Boot> 2.2.4. Мы получили это сообщение об ошибке при запуске:

APPLICATION FAILED TO START

Description:

The Tomcat connector configured to listen on port 1234 failed to start. The port may already be in use or the connector may be misconfigured.

Action:

Verify the connector's configuration, identify and stop any process that's listening on port 1234, or configure this application to listen on another port.

Но порт не использовался, так в чем была проблема?

Проблема была вызвана исправлением для Уязвимость Ghostcat AJP в Tomcat, которое было включено в Spring Boot 2.2.5.

Теперь у вас есть два варианта: либо вы используете AJP с секретом:

final Connector connector = new Connector("AJP/1.3");
connector.setScheme("http");
connector.setPort(ajpPort);
connector.setAllowTrace(false);

final AbstractAjpProtocol protocol = (AbstractAjpProtocol) connector.getProtocolHandler();
connector.setSecure(true);
protocol.setSecret(ajpSecret);

или без него, но для этого вы должны явно установить setSecretRequired на false:

final Connector connector = new Connector("AJP/1.3");
connector.setScheme("http");
connector.setPort(ajpPort);
connector.setAllowTrace(false);

final AbstractAjpProtocol protocol = (AbstractAjpProtocol) connector.getProtocolHandler();
connector.setSecure(false);
protocol.setSecretRequired(false);

Примечание: Более позднее решение сделает ваш tomcat снова уязвимым для Ghostcat.

Для получения дополнительной информации посмотрите эту ветку: Springboot - Коннектор AJP настроен с secretRequired = "true", но секретный атрибут имеет значение null или "" после обновления до 2.2.5.

Другие вопросы по теме