SOAP с SpringBoot: запрос Soap, адресованный неверному URI, волшебным образом перенаправляется на другую конечную точку - PullRequest
0 голосов
/ 04 июля 2019

Я внедряю сервисы SOAP WS с Spring Boot.Чтобы иметь возможность фильтровать запросы на основе URI запроса, я хочу предоставить разные реализации конечной точки при разных сопоставлениях URI.

Для этого я сначала регистрирую оба сопоставления с помощью бина регистрации сервлета:

@EnableWs
@Configuration
public class WebServiceConfig extends WsConfigurerAdapter {
...
    @Bean
    public ServletRegistrationBean messageDispatcherServlet(ApplicationContext applicationContext) {
        MessageDispatcherServlet servlet = new MessageDispatcherServlet();
        servlet.setApplicationContext(applicationContext);
        servlet.setTransformWsdlLocations(true);
        return new ServletRegistrationBean(servlet, "/ws/*", "/special/*" );
    }

и затем я регистрирую свою конечную точку для каждого сопоставления:

@Bean(name = "serviceA")
public DefaultWsdl11Definition caseDocumentWsdl11Definition(XsdSchema caseASchema) {
        DefaultWsdl11Definition wsdl11Definition = new DefaultWsdl11Definition();
        wsdl11Definition.setPortTypeName("CaseAPort");
        wsdl11Definition.setLocationUri("/ws");
        wsdl11Definition.setTargetNamespace(CaseAEndpoint.NAMESPACE_URI);
        wsdl11Definition.setSchema(caseASchema);
        return wsdl11Definition;
}


@Bean(name = "serviceB")
public DefaultWsdl11Definition caseDocumentBkkWsdl11Definition(XsdSchema caseBSchema) {
        DefaultWsdl11Definition wsdl11Definition = new DefaultWsdl11Definition();
        wsdl11Definition.setPortTypeName("CaseBPort");
        wsdl11Definition.setLocationUri("/special");
        wsdl11Definition.setTargetNamespace(CaseBEndpoint.NAMESPACE_URI);
        wsdl11Definition.setSchema(caseBSchema);
        return wsdl11Definition;
}

Теперь нежелательный эффект, который я вижу, заключается в том, что когда я отправляю запрос с полезной нагрузкой для службы A на URI службы B,например, с помощью curl:

curl --header "content-type: text/xml" -d @caseARequest.xml http://localhost:8081/special/

он обрабатывается реализацией CaseAEndpoint, даже если он не зарегистрирован (с помощью setLocationUri) для его обработки.

Таким образом, планируется использовать URI запроса для фильтрацииЗапросы и защита конечных точек не работает.

Любой намек на то, что мне не хватает или мне нужно добавить?

(В качестве обходного пути я добавил проверку в конечной точке impl на основе запросаURI, использующий ServletUriComponentsBuilder.fromCurrentRequestUri().toUriString().contains("special")), но это не так, как должно быть, а не то, что предлагает API, верно?

...