Я внедряю сервисы 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, верно?