Я добавил коннектор для 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());
...
Но это мне не помогает.




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