Обзор
У меня есть приложение SpringBoot-2 с открытыми контроллерами / WebUI и конечными точками WebService.
Я хочу настроить прокси-сервер, который предоставляет только веб-интерфейс, но скрывает службы.
Проблема в том, что контроллеры прослушивают URL-адрес контекста сервера /context/...
и службы ниже этого /context/services/...
. Поэтому простая запись прокси в корне веб-интерфейса также предоставляет сервисы.
В моём случае недопустимо специальное правило в прокси, запрещающее **/services/**
.
Подробнее
У меня есть приложение, которое имеет веб-интерфейс org.springframework.web.*
через org.springframework.stereotype.Controller
и предоставляет конечную точку в качестве Soap-Services через javax.xml.ws.Endpoint
и org.apache.cxf.jaxws.EndpointImpl
.
Один из контроллеров выглядит так, но их гораздо больше:
package com.example;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class HomeController {
@GetMapping("/")
public String index() {
return "redirect:/index";
}
@GetMapping("/login")
public String login() {
return "login";
}
}
WebServiceConfig
-
package com.example;
import org.apache.cxf.Bus;
import org.apache.cxf.jaxws.EndpointImpl;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.xml.ws.Endpoint;
....
@Configuration
public class WebServiceConfig {
private final Bus bus;
private final FancyPort inFancyPort;
public WebServiceConfig(Bus bus, FancyPort inFancyPort) {
this.bus = bus;
this.inFancyPort = inboundSPRIPort;
}
@Bean
public Endpoint endpoint() {
EndpointImpl endpoint = new EndpointImpl(bus, inFancyPort);
endpoint.publish("/fancy");
return endpoint;
}
}
Это приложение затем находится под контекстным путем "/context-path".
Так что я сервер URL, как
Когда я запускаю код в производство, я хочу, чтобы пользовательский интерфейс был виден в Интернете, но «причудливый» сервис скрыт. Таким образом я настраиваю прокси на UI-URL http://my.example.com:8080/context-path/
.
Увы, это открывает и необычные услуги.
Моя идея состоит в том, чтобы поместить все элементы пользовательского интерфейса ниже http://my.example.com:8080/context-path/ui/
, но с сохранением служб ниже http://my.example.com:8080/context-path/services
, тогда я мог бы настроить свой прокси отдельно.
Но как мне сказать springboot, чтобы все интерфейсы были ниже /ui
? со всеми javascript, css и всеми контроллерами пользовательского интерфейса?
Считается уже
Замена всех @Controller
на @Controller("/ui")
. Увы, весной многие соединения осуществляются через пружины, например return "redirect:/index"
. Так что это опасный подход, когда я не могу быть уверен, что поймал все. То же самое верно для всех упоминаний в Html и JavaScript (и Css). Решение, поддерживаемое компилятором, будет предпочтительным.
Разрешение встроенному Tomcat прослушивать два порта через containerCustomizer()
, connector.setPort(port)
и containerFactory.addAdditionalTomcatConnectors()
. Да, это сработало, но я не смог найти способ, позволяющий сервису Fancy
эксклюзивно обслуживаться дополнительным соединителем. Если бы я мог справиться с этим, я думаю, это было бы идеально.
Настройка пружины дочерних приложений с SpringApplicationBuilder
, parentBuilder.child(A.class)
и parentBuilder.child(B.class)
. Это не увенчалось успехом, потому что компоненты, казалось, были в состоянии определить, какие бины им следует создавать. Автоконфигурация, казалось, не работала хорошо в реальной установке: компоненты были созданы дважды, или не совсем. Я полагаю, что хорошо разработанное приложение могло бы сделать это таким образом, но впоследствии отделить его для этого подхода казалось трудным или невозможным.
Разделение одного приложения на два совершенно разных приложения. Это позволило бы мне прослушивать приложения на двух разных портах. С тех пор как Fancy Service помещает все свои сообщения в очередь JMS, которую отображает / обрабатывает WebUi, это, вероятно, осуществимый подход. Но мне действительно интересно ... как может быть, что я должен прибегнуть к этому? Spring должен иметь возможность отложить контроллеры в сторону сервисов, а не над ними. Правильно?