Отдельный WebUI от сервисов в SpringBoot-2 - PullRequest
0 голосов
/ 08 ноября 2018

Обзор

У меня есть приложение 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 должен иметь возможность отложить контроллеры в сторону сервисов, а не над ними. Правильно?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...